针对utf8mb4的MySQL迁移会创建不一致的架构

时间:2018-02-14 23:37:44

标签: mysql ruby-on-rails

我们意识到将MySQL 5.7.20上的charset设置为utf8实际上并不存储所有unicode /表情符号字符。我们正在测试将charset迁移到utf8mb4。为了测试我们在迁移之前和之后检查了模式的不一致性。例如,在迁移之前,使用rake db:schema:dump迁移之前的db / schema.rb转储如下所示(这只是一个片段):

create_table "events", id: :bigint, unsigned: true, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.string "event_type"
  t.string "system"

然后我们在Rails迁移中使用以下命令进行迁移:

execute "ALTER TABLE events CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
execute "ALTER TABLE events CHANGE event_type event_type VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
execute "ALTER TABLE events CHANGE system system VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

然后在迁移后,我们会看到相同的代码段如下:

create_table "events", id: :bigint, unsigned: true, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci" do |t|
  t.string "event_type", collation: "utf8_general_ci"
  t.string "system", limit: 191

新版本的“系统”列看起来是正确的,调整后的最大长度和整理显然现在默认为指定的utf8mb4_unicode_ci。但“event_type”似乎没有迁移,没有调整最大长度,并且排序规则仍然设置为utf8。

迁移命令完全相同,迁移过程中未显示任何错误。

为何与众不同?我们迁移了许多varchar列,有些列出现了没有明显模式的列。两列都是索引。

只要我们实际上没有存储任何内容>,未更改的event_type最大长度确实是个问题。其中有191个字符?

我们正在使用Rails 5.1.3和Ruby 2.4.1。

1 个答案:

答案 0 :(得分:0)

将表格行格式设置为动态修复索引问题。