问题
创建一个9个字段的表,所有的字段都为VARCHAR类型,其中前8个字段都是最大能放下7279个字符,允许为空,字符集类型为latin1,即一个字符只占一个字节,建表语句如下:
CREATE TABLE test_varchar_length6(
a VARCHAR(7279),
b VARCHAR(7279),
c VARCHAR(7279),
d VARCHAR(7279),
e VARCHAR(7279),
f VARCHAR(7279),
g VARCHAR(7279),
h VARCHAR(7279),
i VARCHAR(?)
)DEFAULT CHARSET=latin1
那么i的最大字符数为多少?问题最后揭晓。
VARCHAR 定义
VARCHAR是变长字符串,便于理解,使用CHAR定长类型来对比介绍。
VARCAHR,最多存储4个字符,有几个字符存储几个。存储字节数=数据值的字节和+1字节(长度标识,后面会讲到)
CHAR(4),最多存储4个字符,不足4个尾部用空格填满。存储字节数=数据值的字节和+补位空格数
概括地说,VARCHAR和CHAR都是 MySQL 的字符类型,存储多个字符、可设置最大存储的字符数,存储开销与数据长度、字符集有关。是MySQL 最常用的字符串类型。
CHAR和VARCHAR具体对比:
特性
CHAR
VARCHAR
长度
定长,固定字符数最大255个字符数据长度不足声明值时,在尾部自动填充空格
长度可变,可设置最大存储字符数最大不超过行大小(默认65535字节,注意是字节,下面会讲原因)
前缀
无
1~2字节,看列长度是否可能超过255字节比如VARCHAR(100),字符集为UTF8,则字节最大可能为300字节,所以会使用2个字节标识长度
有否尾部空格
长度不足默认用空格填满检索和获取时会自动去除
不会自动填充空格输入值就包含空格,则会存储,检索和获取数据都会体现
超长处理
超长部分如果是空格自动截断如果是字符,严格模式下会报错
超长部分如果是空格自动截断,并生成警告如果是字符,严格模式下会报错
存储开销
数据值的字节和 + 补位空格数
数据值的字节和 + 长度标识字节数
如果开启PAD_CHAR_TO_FULL_LENGTH模式,检索时尾部空格不会去除
CHAR超过255字符会报错,提示使用TEXT或BLOB:
ERROR 107