MySQL 数据类型 varchar 与 char 的区别
char
是一种固定长度的类型,varchar
是一种可变长度的类型,在实际应用时应该在什么情况下使用,它们有什么区别?
char
与varchar
类型类似,但它们保存和检索的方式不同。char
有固定的长度,而varchar
属于可变长的字符类型。它们最大长度和是否尾部空格被保留等方面也不同。在存储和检索过程中不进行大小写转换。
下面的表格显示了将各种字符串值保存到char(4)
和varchar(4)
列后的结果,说明了char
和varchar
之间的差别:
值 | char(4) | 存储需求 | varchar(4) | 存储需求 |
---|---|---|---|---|
‘’(空) | ‘ ’ | 4 个字节 | ‘’(空) | 1 个字节 |
‘ab’ | ‘ab ’ | 4 个字节 | ‘ab’ | 3 个字节 |
‘abcd’ | ‘abcd’ | 4 个字节 | ‘abcd’ | 5 个字节 |
‘abcdefgh’ | ‘abcd’ | 4 个字节 | ‘abcd’ | 5 个字节 |
从上面可以看得出来char
的长度是固定的,不管你存储的数据是多少它都会都固定的长度。而varchar
则处可变长度但他要在总长度上加 1 字节,这个用来存储字符长度(如果声明的长度超过 255,则使用 2 个字节)。所以实际应用中用户可以根据自己的数据类型来做。
请注意,上表中最后一行的值只适用不使用严格模式时。如果 MySQL 运行在严格模式,超过列长度的值不被保存,并且会出现错误。
从char(4)
和varchar(4)
列检索的值并不总是相同,因为检索时从char
列删除了尾部的空格。通过下面的例子说明差别:
mysql> CREATE TABLE test(a VARCHAR(4), b CHAR(4));
mysql> INSERT INTO test VALUES ('ab ', 'ab ');
mysql> SELECT CONCAT(a, '+'), CONCAT(b, '+') FROM test;
结果如下:
CONCAT(a, '+') CONCAT(b, '+')
ab + ab+
从上面可以看出来,由于char
是固定长度,所以在处理速度上要比varchar
快很多,但是相对浪费存储空间,所以对存储不大,但在速度上有要求的可以使用char
类型,反之可以用varchar
类型来实现。
建议:
MyISAM 存储引擎,建议使用固定长度,数据列代替可变长度的数据列。
INNODB 存储引擎,建议使用VARCHAR类型。
总结分析:
字段存储数据若长度固定,例如身分证号码,不要用varchar
或nvarchar
,应该用char
或nchar
。
字段存储数据若长度不固定,例如居住地址,则用varchar
或nvarchar
。除了可节省存储空间外,存取硬盘时也会较有效率。
支持多语言的站点应考虑使用 Unicodenchar
或nvarchar
数据类型以尽量减少字符转换问题。
(完)