1、使用比固定长度类型(char)占用更少存储空间(除了使用ROW_FORMAT=FIXED创建的MyISAM表)
2、使用额外的1-2字节来存储值长度,列长度<=255使用1字节保存,其它情况使用2字节保存。例如varchar(10)会占用11字节存储空间,varchar(500)会占用502字节存储空间
3、节约空间,所以性能会有帮助。在更新的时候会产生额外的工作。
4、5.0以上版本,取值或设置值都会保存字符串末尾的空格,4.1之前的版本都会把字符串末尾的空格删除掉
5、最大长度远大于平均长度,很少发生更新的时候适合使用varchar,因为减少使用空间,效率提高,碎片更少了
char
1、使用固定长度
2、保存的时候会去掉字符串末尾的空格
3、适合保存MD5后的哈希值或经常改变的值,因为固定的行不容易产生碎片
关于是否去掉字符串末尾的空格
注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。例如:
mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO names VALUES ('Monty ', 'Monty ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT myname = 'Monty ', yourname = 'Monty ' FROM names;
+--------------------+----------------------+
| myname = 'Monty ' | yourname = 'Monty ' |
+--------------------+----------------------+
| 1 | 1 |
+--------------------+----------------------+
1 row in set (0.00 sec)
请注意所有MySQL版本均如此,并且它不受SQL服务器模式的影响。
对于尾部填充字符被裁剪掉或比较时将它们忽视掉的情形,如果列的索引需要唯一的值,在列内插入一个只是填充字符数不同的值将会造成复制键值错误。
CHAR BYTE是CHAR BINARY的别名。这是为了保证兼容性。
ASCII属性为CHAR列分配latin1字符集。UNICODE属性分配ucs2字符集。
对于varchar列来说,SQL模式在启用的时候,大量的尾部空格在插入之前都会被截短,产生一个警告。对于char列来说,不管SQL模式是否被启用,都会静默地去掉插入值的过量的尾部空格。
varchar值存储的时候是不会填充的。如何处理尾部空格,取决于版本。在MySQL5.0.3中,当值存储和检索的时候,保留尾部空格,和标准的SQL保持一致。在MySQL5.0.3之前,值被保存到varchar列的时候,尾部空格会被剔除。这样也就意味着检索值的时候,也不存在这些空格。
在MySQL5.0.3之前,如果你需要一个不去掉尾部空格的数据类型的时候,要考虑BLOB或者TEXT类型。同样当你存储加密数据或者压缩数据的时候,也要使用BLOB列,而不是char或者varchar列,来避免需要改变值的时候,尾部空格的潜在问题。