CHAR和VARCHAR类型类似,但它们存储和检索的方式不同,它们的最大长度和是否尾部空格被保留等方面也不同。
CHAR定义的列的长度为固定的,长度取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。
VARCHAR定义的列的长度为可变长字符串,长度取值可以为0~65535之间,VARCHAR的最大有效长度由最大行大小和使用 的字符集确定。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值存储时不进行填充。,而且在值存储和检索时尾部的空格仍保留。
通过下表来表明它们在存储时的差异:
值 | CHAR(4) | 需要存储 | VARCHAR(4) | 需要存储 |
---|---|---|---|---|
'ab' | 'ab ' | 4 bytes | 'ab' | 3 bytes |
'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
'abcdefg' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
通过一个例子表明它们关于尾部空格的差异,从其中可以看出:取char类型的数据的时候会把空格去掉,但是在取varchar类型的数据时,数据的尾部空格会保留。
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.11 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab ) | (ab) |
+---------------------+---------------------+
1 row in set (0.00 sec)
varchar存储变长数据,可以节省存储空间,但存储效率没有 CHAR高。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。
网友评论