字符串类型 字节 描述及存储需求
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保留。
    1. create table test1(v varchar(4), c char(4));
    2. insert into test1 values('ab ', 'ab ');
    3. select length(v), length(c) from test1;
    4. +-----------+-----------+
    5. | length(v) | length(c) |
    6. +-----------+-----------+
    7. | 4 | 2 |
    8. +-----------+-----------+

binary和varbinary类型

类似于charvarchar类型,不同的是它们包含二进制字符串而不包含非二进制字符串。

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。