我要创建此表:

CREATE TABLE IF NOT EXISTS `my-database`.`user_product` (
  `user_product_id` INT NOT NULL AUTO_INCREMENT,
  `FK_user_id` INT NOT NULL,
  `created_at` DATETIME NOT NULL,
  `long_column_1` VARCHAR(10000) NOT NULL,
  `long_column_2` VARCHAR(10000) NULL DEFAULT NULL,
  `deleted_at` DATETIME NULL DEFAULT NULL,
  PRIMARY KEY (`user_product_id`),
  INDEX `user_id_idx` (`FK_user_id` ASC) VISIBLE,
  CONSTRAINT `FK_user_id`
    FOREIGN KEY (`FK_user_id`)
    REFERENCES `my-database`.`user` (`user_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

客户端需要两列,可以很短也可以很长,"long\u column\u 1"和"long\u column\u 2"(忽略它们的名称,这只是示例).我读到文本类型比VARCHAR慢,可能99%的时候两列都会短于255,所以我创建了VARCHAR(10000)而不是TEXT.

Why does it give "Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535" error?

总大小不大于65535,因为10000+10000=20000.

这是"用户"表,以备不时之需:

CREATE TABLE IF NOT EXISTS `my-database`.`user` (
  `user_id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(45) NOT NULL,
  `password` VARCHAR(60) NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
ENGINE = InnoDB;

我正在使用MySql 8

推荐答案

MySQL必须假设该行在最坏的情况下仍然适合.也就是说,即使在两个VARCHAR(10000)列中都存储长字符串而不是短字符串,并且在字符串的每个位置都存储多字节字符,该行也必须适合.

在utf8mb4中,如果存储'????' 对于MySQL's row size limit of 6553500个字符,需要40000 bytes个字符.两个这样的字符串需要80000字节.这远远超过MySQL's row size limit of 65535.

可以通过将列定义为TEXT而不是长varchar来修复此问题.BLOB和TEXT(及其变体)不计入行大小限制.

Mysql相关问答推荐

正在获取MySQL死锁,因为这个查询需要很长时间.

使用MySQL工作台导出具有数据的数据库表并导入到其字段具有不同数据类型的同一表中

可以优化这个带有重复WHERE子句的查询吗?

计算男生的人数和女生的人数.学生是有入学记录的人

从 NextJS/Prisma 添加用户 ID (FK) 到 MySQL 表

没有 ORDER BY 的查询性能很高,有 ORDER BY 的查询速度慢得像爬行一样

在 mySQL 中计算每日数组的每周指标

将 JSON 类型的列与特定字符串值进行比较

如何本地化 MySQL 表中的实体?

从多到多表中 Select 数据而无需重复

基于 2 列的重复行的 SQL 查询

具有别名主机的 ssh 反向 mysql tunel

如何使用 sequelize 将复合主键放在连接表中?

MySQL Workbench - 如何同步 EER 图

MySQL使用多列 Select 重复记录

从终端访问 MAMP 的 MySQL

我的 PDO 声明不起作用

MySQL中的行值增加和减少1

加快 mysql 转储和导入

MySQL中的base64编码