MySQL :: MySQL 8.2 Reference Manual :: 11.3.2 The CHAR and VARCHAR Types
- CHAR和VARCHAR两个数据类型类似,但在存储和取回方面不同、最大长度不同、结尾的空格是否保留方面不同。
- 一个列声明为CHAR、或者VARCHAR类型,要指明一个长度,这个长度就是该字段能够保存的最大字符的数量。例如,CHAR(30)表示字段最多能保存30个字符。
CHAR列的长度是固定的,就等于创建表时对该字段声明的长度,可以声明长度的范围是0到255。当保存CHAR值的时候,会在右边填充空格使总长度达到声明的长度。当取回CHAR的值时,会去掉后面的空格,除非使用了PAD_CHAR_TO_FULL_LENGTH模式(不过这个模式已经废弃,会在将来的某个版本去掉)。
VARCHAR列是变长字符串。可以声明的长度是0到65535。与CHAR列不同,VARCHAR列用1个字节、或者2个字节的长度前缀+数据来保存。如果数据保存需要的字节数小于255,那么只用1个字节的长度前缀;如果数据保存需要的字节数大于255,那么要用2个字节的长度前缀。即便数据长度小于声明的字段长度,VARCHAR的值当存储的时候不额外用空格填充。如果数据本身后面有空格,存储和取回的时候空格都保留。
示例:下表通过各种值存入CHAR(4)、VARCHAR(4)列演示了它们的区别。假设列用了单字节字符集,例如
latin1:
要存入的值 | CHAR(4)列保存的值 | CHAR(4) 存储需要的字节数 | VARCHAR(4)列保存的值 | VARCHAR(4) 存储需要的字节数 |
---|---|---|---|---|
'' | ' ' | 4 bytes | '' | 1 byte |
'ab' | 'ab ' | 4 bytes | 'ab' | 3 bytes |
'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
'abcdefgh' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
备注:在上面表中最后一行的示例中,只有当没有使用严格SQL模式的时候才适应。如果使用了严格SQL模式,当值的长度超过列声明的长度,不会被存储,而会发生一个错误。