报错sql
CREATE TABLE `modo_notify` (
-> `notify_id` varchar(32) NOT NULL,
-> `audience_type` varchar(128) DEFAULT NULL,
-> `notify_audiences` varchar(1024) DEFAULT NULL,
-> `notify_content` varchar(4000) DEFAULT NULL,
-> `create_date` varchar(64) DEFAULT NULL,
-> `create_user` varchar(128) DEFAULT NULL,
-> `end_date` varchar(64) DEFAULT NULL,
-> `notify_files` varchar(4000) DEFAULT NULL,
-> `notify_images` varchar(4000) DEFAULT NULL,
-> `publish_date` varchar(64) DEFAULT NULL,
-> `recieve_users` varchar(1024) DEFAULT NULL,
-> `notify_title` varchar(128) DEFAULT NULL,
-> `notify_type` varchar(1024) DEFAULT NULL,
-> `valid` varchar(128) DEFAULT NULL,
-> `file_name` varchar(512) DEFAULT NULL,
-> `file_path` varchar(512) DEFAULT NULL,
-> PRIMARY KEY (`notify_id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ERROR 1118 (42000): 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
意不意外,惊不惊喜。
分析
chatGpt一问
MySQL中的错误
ERROR 1118 (42000)
表示单行的数据长度超过了允许的最大值。这通常发生在InnoDB表中,因为InnoDB有一个限制,即单行的最大长度不能超过65535
字节。这个限制主要来自于InnoDB的页大小,通常是16KB
。解决方法:
减少列的数量或者减少每个列的数据类型大小。
使用
VARCHAR
、TEXT
、BLOB
数据类型代替CHAR
和ENUM
类型,因为VARCHAR
类型能够更高效地存储大数据。如果是因为单个列的长度过长(如
VARCHAR(255)
或TEXT
列在存储较大数据时),考虑减少这些列的最大长度。如果是因为索引太多,考虑减少不必要的索引,或者重新设计数据库模式,使用更合适的数据类型。
如果确实需要存储大量数据,可以考虑将大字段拆分到其他表中,通过JOIN查询来使用这些数据。
看其他大神的解答
报错原因:
MySQL 建表时有一个单行最大限制长度限定:一张表中所有字段设置的字节数总和不大于 65535 字节。
注意点一:单个字段大小超过 65535 转换为 TEXT。
注意点二:其余字段总和不超过 65535 字节(不包括 BLOB/TEXT)。
注意点三:数据库使用 UTF-8 编码,一个字符 = 三个字节大小(使用编码不同,字节数大小略有不同)。
报错举例:数据库存在 10 个 varchar 字段,每个大小为 3000 则数据库单行目前计算长度为 3000 * 10 * 3 = 90000 > 65535 ,则建表时就会报错。
解决办法:
将数据库表大字段类型设置为 TEXT,或者将部分可以减小长度的长度调小至总和小于 65535。
调整完之后,执行建表语句,又报如下错误:
1. Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FO