mysql行大小太大,但仅在5.7中

rt4zxlrg  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(449)

当我使用 rake db:schema:load 要在运行MySQL5.6.22的笔记本电脑上创建下表,它可以正常加载:

  1. create_table "inv_audits", force: :cascade do |t|
  2. t.integer "inv_node_id", limit: 2, null: false
  3. t.integer "inv_object_id", limit: 4, null: false
  4. t.integer "inv_version_id", limit: 4, null: false
  5. t.integer "inv_file_id", limit: 4, null: false
  6. t.string "url", limit: 16383
  7. t.string "status", limit: 18, default: "unknown", null: false
  8. t.datetime "created", null: false
  9. t.datetime "verified"
  10. t.datetime "modified"
  11. t.integer "failed_size", limit: 8, default: 0, null: false
  12. t.string "failed_digest_value", limit: 255
  13. t.text "note", limit: 65535
  14. end

然而,当我在运行5.7.21的桌面上尝试做同样的事情时,它失败了 Mysql2::Error: Row size too large. 从跟踪生成的sql是:

  1. CREATE TABLE `inv_audits` (
  2. `id` int(11) auto_increment PRIMARY KEY,
  3. `inv_node_id` smallint NOT NULL,
  4. `inv_object_id` int(11) NOT NULL,
  5. `inv_version_id` int(11) NOT NULL,
  6. `inv_file_id` int(11) NOT NULL,
  7. `url` varchar(16383),
  8. `status` varchar(18) DEFAULT 'unknown' NOT NULL,
  9. `created` datetime NOT NULL,
  10. `verified` datetime,
  11. `modified` datetime,
  12. `failed_size` bigint DEFAULT 0 NOT NULL,
  13. `failed_digest_value` varchar(255),
  14. `note` text
  15. ) ENGINE=InnoDB

为什么在5.7中失败,但在5.6中成功?
这两台机器都是64位mac,运行macos high sierra(10.13.4)。

xdyibdwo

xdyibdwo1#

字符类型列的字符集,特别是
url VARCHAR 列。
数据类型定义的length属性 VARCHAR(16383) 指定字符数。
但是innodb的行大小限制是以字节为单位的。
对于单字节字符集(例如拉丁1),列的最大字节数为16383(加上隐藏长度的空间)。这样就好了。
对于多字节字符集,例如utf8(每个字符最多3个字节)或utf8mb4(每个字符最多4个字节),所需的字节数将超过innodb行允许的最大字节数。
在5.6系统上,我们可以

  1. SHOW CREATE TABLE inv_audits

如果没有为列指定字符集/排序规则,则表的默认值将生效(可以指定表的characterset,如果不指定,它将继承数据库的默认集。)
为了得到在5.7中创建的表,作为test,将varchar大小减少到当前值的1/4,然后查看create表。

  1. SHOW CREATE TABLE inv_audits

它将是一个多字节字符集,比如utf8或utf8mb4。
我敢打赌问题的根本原因是5.6和5.7中的默认字符集不同。

展开查看全部

相关问题