CHAR 和VARCHAR 类型类似,都用来存储字符串,但它们保存和检索的方式不同。
CHAR属于固定长度的字符类型,而VARCHAR 属于可变长度的字符类型。
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+-------------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+-------------------+
| ab + | ab+ |
+----------------+--------------------+
1 row in set (0.00 sec)
由于CHAR 是固定长度的,所以它的处理速度比VARCHAR 快得多,但是其缺点是浪费存储空间,程序需要对行尾空格进行处理,所以对于那些长度变化不大并且对查询速度有较高要求的数据可以考虑使用CHAR 类型来存储。
在MySQL 中,不同的存储引擎对CHAR 和VARCHAR 的使用原则有所不同,这里简单概括如下。
1、 MyISAM 存储引擎:建议使用固定长度的数据列代替可变长度的数据列。
2、 MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用CHAR 或VARCHAR 列都没有关系。两者都是作为CHAR 类型处理。
3、 InnoDB 存储引擎:建议使用VARCHAR 类型。对于InnoDB 数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR 列不一定比使用可变长度VARCHAR 列性能要好。因而,主要的性能因素是数据行使用的存储总量。由于CHAR 平均占用的空间多于VARCHAR,因此使用VARCHAR 来最小化需要处理的数据行的存储总量和磁盘I/O 是比较好的。