字符串类型 | 字节 | 描述及存储需求 |
---|---|---|
char(M) | M | M为0-255之间的整数 |
varchar(M) | M为0-65535之间的整数,值的长度+1个字节 | |
tinyblob | 允许长度0-255字节,值的长度为+1个字节 | |
blob | 允许长度0-65535字节,值的长度为+2个字节 | |
mediumblob | 允许长度0-167772150字节,值的长度为+3个字节 | |
longblob | 允许长度0-4294967295字节,值的长度为+4个字节 | |
tinytext | 允许长度0-255字节,值的长度为+2个字节 | |
text | 允许长度0-65535字节,值的长度为+2个字节 | |
mediumtext | 允许长度0-167772150字节,值的长度为+3个字节 | |
longtext | 允许长度0-4294967295字节,值的长度为+4个字节 | |
varbinary(M) | 允许长度为0-M个字节的变长字符串,值的长度+1字节 | |
Binary(M) | M | 允许长度为0-M个字节的定长字节字符串 |
char和varchar类型
- 都用来保存MySQL中较短的字符串。
char
列的长度为声明时创建的长度,而varchar
为可变长的字符串。- 检索时,
char
列会删除尾部的空格,而varchar
保留。create table test1(v varchar(4), c char(4));
insert into test1 values('ab ', 'ab ');
select length(v), length(c) from test1;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
| 4 | 2 |
+-----------+-----------+
binary和varbinary类型
类似于char
和varchar
类型,不同的是它们包含二进制字符串而不包含非二进制字符串。
create table test2 (c binary(3));
insert into test2 values ('a');
select * , hex(c), c = 'a', c = 'a\0', c = 'a\0\0' from test2;
+------+--------+---------+-----------+-------------+
| c | hex(c) | c = 'a' | c = 'a\0' | c = 'a\0\0' |
+------+--------+---------+-----------+-------------+
| a | 610000 | 0 | 0 | 1 |
+------+--------+---------+-----------+-------------+
当保存为binary
时,在值的最后通过填充“0x00”零字节来达到指定的字段定义长度。
alter table test2 add v varbinary(3);
update test2 set v = 'a' where c = 'a\0\0';
mysql> select * from test2;
+------+------+
| c | v |
+------+------+
| a | a |
+------+------+
select hex(c), hex(v) from test2;
+--------+--------+
| hex(c) | hex(v) |
+--------+--------+
| 610000 | 61 |
+--------+--------+
select length(c), length(v) from test2;
+-----------+-----------+
| length(c) | length(v) |
+-----------+-----------+
| 3 | 1 |
+-----------+-----------+
enum枚举类型
对1-255个成员枚举需要1字节存储,对于255-65535个成员,需要2字节存储。最多允许65535个成员。
create table test3 (gender enum('M', 'F')); insert into test3 values('f'), ('m'), ('1'), (null); select * from test3; +--------+ | gender | +--------+ | F | | M | | M | | NULL | +--------+
不区分大小写。
- 如果插入枚举以外的值,会插入声明时第一个值,即enum(‘M’, ‘f’)中的M。