char和varchar类型是类似的,然而他们在存储和检索上也存在不同,并且它们在最大长度和结尾是否保留空格上也有不同。
char的长度在你创建表格的时候由你本人定义的.长度的范畴是0-255。当char值被存储的时候,它应用空格填充到规定的长度。当查看char值时,结尾空格将删除尾部空格,除非PAD_CHAR_TO_FULL_LENGTH这个SQL_MODE被启用。
varchar列中的值是可变的字符串,长度规定在0到65535范畴内。VACHAR的无效最大长度受限于最大行大小和应用的字符集。
与char产生鲜明对比的是,varchar的值被用1-2两个字节存储前缀数据。前缀的长度表明字节数,如果不超过255字节,一列应用一个长度的字节来示意。如果超过255字节,则应用两个长度的字节。
如果没启动严格的SQL模式,对CHAR或者VARCHAR进行赋值阶段,如果列超过了列的最大长度,值会裁剪而后生成一个正告。如果应用严格的SQL模式,会产生一个谬误。
不论应用那种SQL模式,VARCHAR在插入前都会截断超出列长度的结尾空格,并生成正告。
char & varchar设置的最长度仅为8,然而上面的语句是能够执行胜利的update `SimpleBookStore`.`Book_0` set `text`='123123 ' where `id`='2'
和规范的SQL保持一致,VARCHAR的值当他们被存储的时候值不会被填充,被存储的时候尾部空格会被存储和检索。
下表通过显示将各种字符串值存储到CHAR(4)和VARCHAR(4)列中的后果来阐明CHAR和VARCHAR之间的区别(假如该列应用单字节字符集,如latin1)。
显示在表的最初一行中的值仅在不应用严格的SQL模式时才实用。 如果启用了严格模式,则不会存储超过列长度的值,并且会导致谬误。
InnoDB将长度大于或等于768字节的固定长度字段编码为可变长度字段,能够将其存储在页面外。 例如,如果字符集的最大字节长度大于3(如utf8mb4一样),则CHAR(255)列能够超过768个字节。
如果给定值存储在CHAR(4)和VARCHAR(4)列中,则从这些列检索的值并不总是雷同的,因为检索时会从CHAR列中删除尾随空格。 以下示例阐明了这种差别:
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));Query OK, 0 rows affected (0.01 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) |+---------------------+---------------------+1 row in set (0.06 sec)
CHAR,VARCHAR和TEXT列中的值依据调配给该列的字符集排序规定进行排序和比拟。