char和varchar类型是类似的,可是他们在存储和检索上也存在不一样,而且它们在最大长度和结尾是否保留空格上也有不一样。mysql
char的长度在你建立表格的时候由你本身定义的.长度的范围是0-255。当char值被存储的时候,它使用空格填充到规定的长度。当检查char值时,结尾空格将删除尾部空格,除非PAD_CHAR_TO_FULL_LENGTH这个SQL_MODE被启用。sql
varchar列中的值是可变的字符串,长度规定在0到65535范围内。VACHAR的有效最大长度受限于最大行大小和使用的字符集。编码
与char产生鲜明对比的是,varchar的值被用1-2两个字节存储前缀数据。前缀的长度代表字节数,若是不超过255字节,一列使用一个长度的字节来表示。若是超过255字节,则使用两个长度的字节。code
若是没启动严格的SQL模式,对CHAR或者VARCHAR进行赋值阶段,若是列超过了列的最大长度,值会裁剪而后生成一个警告。若是使用严格的SQL模式,会产生一个错误。排序
无论使用那种SQL模式,VARCHAR在插入前都会截断超出列长度的结尾空格,并生成警告。字符串
char & varchar设置的最长度仅为8,可是下面的语句是能够执行成功的 update `SimpleBookStore`.`Book_0` set `text`='123123 ' where `id`='2'
和标准的SQL保持一致,VARCHAR的值当他们被存储的时候值不会被填充,被存储的时候尾部空格会被存储和检索。it
下表经过显示将各类字符串值存储到CHAR(4)和VARCHAR(4)列中的结果来讲明CHAR和VARCHAR之间的区别(假设该列使用单字节字符集,如latin1)。date
显示在表的最后一行中的值仅在不使用严格的SQL模式时才适用。 若是启用了严格模式,则不会存储超过列长度的值,而且会致使错误。im
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列中的值根据分配给该列的字符集排序规则进行排序和比较。