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 |
+--------------------+----------------------+