CHAR与VARCHAR的区别

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合适,关键是根据实际情况找到权衡点。

你可能感兴趣的:(CHAR与VARCHAR的区别)