MySQL:列大小限制

标签 mysql sql database innodb

我目前在 Windows 操作系统上工作,我已经安装了 MySQL 社区服务器 5.6.30,一切正常。我有一个初始化数据库的脚本,一切正常。

现在我尝试在 Linux 环境(相同的 MySQL 版本)上运行此脚本,但出现以下错误:

ERROR 1074 (42000) at line 3: Column length too big for column 'txt' (max = 21845); use BLOB or TEXT instead

脚本-

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;

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

更新 1

在 AWS 的 RDS 上它也可以工作,我很确定它只是 linux 之上的一项服务,所以显然它只是一个配置问题。

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

更新 2

我很欣赏所建议的不同解决方案,但我并不是在寻找新的解决方案,我只是在寻找答案,就像为什么 varchar(50k) 在 windows 下工作而在 linux 下不工作一样。 顺便说一句,我正在使用字符集 UTF8 和排序规则 utf8_general_ci。

回答

回答我自己的问题,这是 SQL_MODE 设置的问题 STRICT_TRANS_TABLES 并且应该已被删除。

最佳答案

根据文档:

Although InnoDB supports row sizes larger than 65,535 bytes internally, MySQL itself imposes a row-size limit of 65,535 for the combined size of all columns:

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;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

(不幸的是,这个例子没有提供字符集,所以我们真的不知道列有多大。)

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

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

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

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

关于MySQL:列大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36953538/

相关文章:

php - PDO::FETCH_ASSOC with SUM() 不工作?

mysql - 从多个表中选择并左连接到一个表

基于字母代码的 PHP/SQL ID

mysql - 使用查询中给定的行数生成 SQL 查询

mysql - 使用 MySQL for Excel - 数据库中的一个特定表将无法导入,所有其他表都工作正常

mysql - 稍微复杂一点的多对多关系

Java-MySql : Query to get all the values of the column

mysql - 按日期从数据库中选择,但不包含日、月和年

java - 尝试将数据添加到数据库

ruby-on-rails - 如果 rails 中的所有空字符串,则停止保存记录