两点声明:
- MySQL要求一个行的定义长度(所有字段长度的和)不能超过65535
- 单个字段如果大于65535,则需要转为转换为TEXT 类型存储。
- 单行最大限制为65535,这里不包括TEXT、BLOB。
- 数据库中 gbk编码一个字符占用2个字节,utf8编码一个字符占3个字节,utf8mb4编码一个字符占4个字节
详细描述:
示例1:
当创建 字符集类型为 utf8mb4、字段可以为 NULL 值、只有 1 个 varchar 字段 的表时:
SQL:
CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=utf8mb4;
错误:
[Err] 1074 - Column length too big for column ‘name‘ (max = 16383); use BLOB or TEXT instead
解析:
varchar字段数据最大长度
= 一行记录最大的数据大小(字节) / 字符集表示一个字符时的最大大小(字节)
= (最大行记录大小(65535 字节)- 记录数据真实长度信息(2 字节) - NULL 值标识(1 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))
即:VARCHAR 字段类型最多能存储的数据长度 = (65535 - 2 - 1) / 4 = 16383 。
修改SQL:
CREATE TABLE t1 (name varchar(16383) NULL) CHARSET=utf8mb4;
示例2:
当创建 字符集类型为 utf8mb4、字段为not NULL 值、只有 1 个 varchar 字段 的表时:
SQL:
CREATE TABLE t2 (name varchar(65535) NOT NULL) CHARSET=utf8mb4;
错误:
[Err] 1074 - Column length too big for column ‘name‘ (max = 16383); use BLOB or TEXT instead
解析:
VARCHAR 字段类型最多能存储的数据长度 = (最大行记录大小(65535 字节)- 记录数据真实长度信息(2 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))
VARCHAR 字段类型最多能存储的数据长度 = (65535 - 2 ) / 4 = 16383.25 ,约为 16383 。
修改SQL:
CREATE TABLE t2 (name varchar(16383) NOT NULL) CHARSET=utf8mb4;
示例3:
当创建 字符集类型为 utf8mb4、字段不可以为 NULL 值、只有 1 个 varchar 字段、加上 1 个 int 字段的表时,情况又不一样了。
SQL:
CREATE TABLE t3 (name varchar(16383) NULL, age int) CHARSET=utf8mb4;
错误:
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
解析:
VARCHAR 字段类型最多能存储的数据长度
= 一行记录最大的数据大小(字节) / 字符集表示一个字符时的最大大小(字节)
= (最大行记录大小(65535 字节)- 记录数据真实长度信息(2 字节) - NULL 值(1 字节)- int 类型的大小( 4 字节)) / (utf8mb4 表示一个字符时的最大大小 (4 字节))
即:VARCHAR 字段类型最多能存储的数据长度 = ( 65535 - 2 - 1 -4 ) / 4 = 16382 。
示例4:
如果我们更改编码类型为utf8 和 gbk看看报错信息
GBK:
CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=GBK; #[Err] 1074 - Column length too big for column ‘name‘ (max = 32767); use BLOB or TEXT instead
字段长度 = (65535 - 2 - 1) / 2 = 32766
UTF8:
CREATE TABLE t1 (name varchar(65535) NULL) CHARSET=utf8; #[Err] 1074 - Column length too big for column ‘name‘ (max = 21845); use BLOB or TEXT instead
字段长度 = (65535 - 2 - 1) / 3 = 21844
上面虽然提示了最大长度分别为32767和21845但是真创建时候会报错的
[SQL]CREATE TABLE t3 (name varchar(32767) NULL) CHARSET=GBK; [Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
修改SQL:
[SQL]CREATE TABLE t3 (name varchar(32766) NULL) CHARSET=GBK; 受影响的行: 0 时间: 0.006s
参考网站:跳转