问题背景:
在开发项目时,想要复制一份线上的表结构,在本地创建表。根据线上的表生成的创建语句大概如下:
create table demo(
name varchar(1845) not null ,
context varchar(10000) not null ,
english_name varchar(10000) not null
)ENGINE = MyISAM DEFAULT CHARSET = utf8mb3;
执行会报:
[2023-02-20 14:51:54] [42000][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
翻译:
行大小太大。所用表类型(不包括BLOB)的最大行大小为65535。这包括存储开销,请查看手册。您必须将某些列更改为TEXT或BLOB
Tip: 可以看到,报错信息中已经包含了解决方案,可以更改字段的类型,来实现创建表。可是我并不像改变字段的类型,因为线上的表字段类型可以创建成功,说明我写的创建语句多少还是有些问题。有的方案是更改存储引擎。如下:
create table demo(
name varchar(1845) not null ,
context varchar(10000) not null ,
english_name varchar(10000) not null
)ENGINE = MyISAM DEFAULT CHARSET = utf8mb3;
有些人好像成功了,我试了一下,并不可以。
解决方案:
utf8mb3 | utf8mb4 |
1字符 = 3字节 | 1字符 = 4字节 |
存储上限列总和 varchar(21845) 65535/3 | 存储上限列总和 varchar(16383) 65535/4 |
根据排序规则合理分配varchar()的长度。
重新分配后的sql如下:
create table demo(
name varchar(1844) not null ,
context varchar(10000) not null ,
english_name varchar(10000) not null
)DEFAULT CHARSET = utf8mb3;
评论前必须登录!
注册