1. CAHR与VARCHAR
类型 |
| 范围 | 字节 | 备注 |
[NATIONAL] CHAR(M) [BINARY| ASCII | UNICODE] | 固定长度字符串 | M表示列长度。M的范围是0到255个字符 | M个字节 0 <= M <= 255 | 1.当保存时在右侧填充空格以达到指定的长度. 2.当检索CHAR值时尾部空格被删除。 3.在存储或检索过程中不进行大小写转换。 |
[NATIONAL] VARCHAR(M) [BINARY] | 变长字符串 | M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定。最大有效长度是65,532字节)。 | L+1个字节,其中L <= M 且0 <= M <= 65535 | 1.同CHAR对比,VARCHAR值保存时只保存需要的字符数并不进行填充,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。 2.当值保存和检索时尾部的空格仍保留,符合标准SQL |
如想了解更多VARCHAR字段长度请点击
2. 下面的表显示了将各种字符串值保存到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个字节 |
注意:上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值不保存,并且会出现错误。
3. 从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空格。通过下面的例子说明该差别:
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab + | ab+ |
+----------------+----------------+
4. 但是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 |
+--------------------+----------------------+