MySQ字符类型大致可以分成(MySQL 5.0):
CHAR(M):0-255字节
VARCHAR(M):0-65535字节
TINYBLOB、MEDIUMBLOB、BLOB、LONGBLOB(实际长度分别+1,3,2,4)
TINYTEXT、MEDIUMTEXT、TEXT、LONGTEXT(实际长度分别+1,3,2,4)
BINARY(M):0-M字节
VARBINARY(M):实际长度+1
MySQL其他类型大致可以分成(MySQL 5.0):
ENUM(枚举类型):1~65535个成员 1—2个字节
SET:1--8字节
详细范围可以参考帮助手册
1.CHAR、VARCHAR、XXXTEXT
create table test4(c1 char(7),varchar(7));
insert test4 values(' a ',' a ');
mysql> select length(c1),length(c2),concat(c1,'yes'),concat(c2,'yes')
-> from test4;
+------------+------------+------------------+------------------+
| length(c1) | length(c2) | concat(c1,'yes') | concat(c2,'yes') |
+------------+------------+------------------+------------------+
| 2 | 3 | ayes | a yes |
+------------+------------+------------------+------------------+
可以很明显看出,char类型和varchar类型的前空格在检索时不会被省略,但是尾部空格就不一样了,char类型尾部空格是忽略的,varchar类型则反之;
至于varchar与TEXT是完全一样的(以前的版本的是和TINYTEXT版本一样),唯一的区别在于TEXT的上限是确定的,不需要特定区设置一个宽度,但是varchar类型需要自己设定。
2..xxxBLOB BINARY(M) VARBINARY(M):
它们的都是存储二进制字符串的字段类型。他们与文本的区别是排序是按照二进制编码进行的,使得排序更加准确。
3.ENUM
mysql> create table test5(en enum('A','B'));
mysql> insert test5 select 'a';
mysql> insert test5 select null;
mysql> select * from test5;
+------+
| en |
+------+
| A |
| NULL |
+------+
mysql> insert test5 select 'c';
mysql> show warnings;
+-------+------+-----------------------------------------+
| Level | Code | Message |
+-------+------+-----------------------------------------+
| Error | 1265 | Data truncated for column 'en' at row 1 |
+-------+------+-----------------------------------------+
在我的5.1测试版本上 插入的值如果有必要,会转化成大写;再插入枚举列表以外的值,出错;在5.0中,插入枚举列表以外的值,自动转化成枚举列表的第一个值;
4.SET类型
mysql> create table test6(col SET('1','2','3','a','6'));
mysql> insert test6 values('1,2'),('1,2,3,a'),('1,1,2,2,3,3');
mysql> select * from test6;
+---------+
| col |
+---------+
| 1,2 |
| 1,2,3,a |
| 1,2,3 |
+---------+
mysql> insert test6 select 'ak47';
mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------+
| Error | 1265 | Data truncated for column 'col' at row 1 |
+-------+------+------------------------------------------+
可以插入任意组合的值,当输入重复的枚举值的时候会自动去重;当插入不存在的组合时候,报错;
参考文献:深入浅出MySQL(网易)