MySQL:列大小限制

Tal*_*tay 6 mysql sql database innodb

我目前正在开发Windows操作系统,我已经安装了MySQL社区服务器5.6.30,一切都很好.我有一个初始化数据库的脚本,并且一切正常.

现在我正在尝试在Linux环境中运行此脚本 - 相同的MySQL版本 - 我收到以下错误:

第3行的错误1074(42000):列'txt'的列长太大(max = 21845); 请改用BLOB或TEXT

脚本 -

DROP TABLE IF EXISTS text;
CREATE TABLE `texts` (
  `id` BINARY(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
  `txt` VARCHAR(50000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

显然我的Windows操作系统上有一些我需要在Linux上复制的MySQL服务器配置; 任何人都可以分享想法吗?

更新1

在AWS的RDS上,它也可以工作,我非常确定它只是一个基于Linux的服务,所以显然它只是一个配置问题.

有没有人知道如何用UTF8达到varchar 50k?我不想使用TEXT或MEDIUMTEXT或其他任何东西,只是普通的旧varchar(大小)

更新2

我很欣赏所提出的不同的解决方案,但我不寻找新的解决方案我只是寻找答案,为什么varchar(50k)在Windows下工作,在linux下它没有.顺便说一句,我使用字符集UTF8和collat​​ion utf8_general_ci.

回答

回答我自己的问题,它是SQL_MODE的问题,它被设置为STRICT_TRANS_TABLES并且应该被删除.

Gor*_*off 5

根据文档:

虽然 InnoDB 内部支持大于 65,535 字节的行大小,但 MySQL 本身对所有列的组合大小施加了 65,535 的行大小限制:

mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000),
    -> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
    -> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

错误 1118 (42000):行大小太大。所用表类型的最大行大小(不包括 BLOB)为 65535。您必须将某些列更改为 TEXT 或 BLOB

(不幸的是,这个示例没有提供字符集,因此我们并不真正知道列有多大。)

utf8 编码每个字符使用 1、2 或 3 个字节。因此,65,535 字节的页面(MySQL 最大值)中可以安全容纳的最大字符数为 21,845 个字符 (21,845*3 = 65,535)。

尽管版本相似,但 Windows 在空间分配方面很保守,并保证您可以在该字段中存储任何字符。Linux似乎有更自由放任的态度。您可以存储一些超过 21,845 个字符的字符串,具体取决于字符。

我不知道为什么同一版本中会存在这种差异。从某种意义上来说,这两种方法都是“正确的”。有足够简单的解决方法:

  • 使用TEXT
  • 切换到具有较短字符的排序规则(这可能是您想要存储的内容)。
  • 减小字段的大小。


小智 2

请简单地使用 TEXT 来声明 txt 列

DROP TABLE IF EXISTS text;
CREATE TABLE `texts` (
  `id` BINARY(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
  `txt` TEXT DEFAULT NULL,
   PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)