gpt4 book ai didi

MySQL 行大小太大,但仅限于 5.7

转载 作者:行者123 更新时间:2023-11-29 01:35:23 25 4
gpt4 key购买 nike

当我使用 rake db:schema:load 在运行 MySQL 5.6.22 的笔记本电脑上创建下表时,它加载正常:

  create_table "inv_audits", force: :cascade do |t|
t.integer "inv_node_id", limit: 2, null: false
t.integer "inv_object_id", limit: 4, null: false
t.integer "inv_version_id", limit: 4, null: false
t.integer "inv_file_id", limit: 4, null: false
t.string "url", limit: 16383
t.string "status", limit: 18, default: "unknown", null: false
t.datetime "created", null: false
t.datetime "verified"
t.datetime "modified"
t.integer "failed_size", limit: 8, default: 0, null: false
t.string "failed_digest_value", limit: 255
t.text "note", limit: 65535
end

但是,当我尝试在运行 5.7.21 的桌面上执行相同的操作时,它失败并显示 Mysql2::Error: Row size too large.

从跟踪中生成的 SQL 是:

CREATE TABLE `inv_audits` (
`id` int(11) auto_increment PRIMARY KEY,
`inv_node_id` smallint NOT NULL,
`inv_object_id` int(11) NOT NULL,
`inv_version_id` int(11) NOT NULL,
`inv_file_id` int(11) NOT NULL,
`url` varchar(16383),
`status` varchar(18) DEFAULT 'unknown' NOT NULL,
`created` datetime NOT NULL,
`verified` datetime,
`modified` datetime,
`failed_size` bigint DEFAULT 0 NOT NULL,
`failed_digest_value` varchar(255),
`note` text
) ENGINE=InnoDB

为什么这会在 5.7 中失败但在 5.6 中成功?

两台机器都是运行 macOS High Sierra (10.13.4) 的 64 位 Mac。

最佳答案

字符类型列的字符集,特别是 url VARCHAR 列。

数据类型定义 VARCHAR(16383) 的长度属性指定了字符的数量。

但 InnoDB 行大小限制以字节为单位。

对于单字节字符集(例如 latin1),该列的最大字节数为 16383(加上隐藏长度的空间)。这样就好了。

使用多字节字符集,例如utf8(每个字符最多 3 个字节)或 utf8mb4(每个字符最多 4 个字节),所需的字节数将超过 InnoDB 行允许的最大字节数。


在5.6系统上,我们可以做一个

 SHOW CREATE TABLE inv_audits

如果没有为该列指定字符集/排序规则,则表的默认值有效。 (表的字符集可以指定,如果不指定,则继承数据库的默认集。)

要获取在 5.7 上创建的表,作为测试,将 VARCHAR 大小减小到当前值的 1/4,然后查看 CREATE TABLE。

 SHOW CREATE TABLE inv_audits

而且它将是一个多字节字符集,例如 utf8 或 utf8mb4。


我敢打赌问题的根本原因是 5.6 和 5.7 中的默认字符集不同。

关于MySQL 行大小太大,但仅限于 5.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com