【发布时间】:2018-02-14 23:37:43
【问题描述】:
我们意识到将 MySQL 5.7.20 上的 charset 设置为 utf8 实际上并没有存储所有 unicode/emoji 字符。我们正在测试将字符集迁移到 utf8mb4。为了测试,我们检查了迁移前后的架构是否存在不一致。例如,在迁移之前,使用rake db:schema:dump 迁移之前的 db/schema.rb 转储如下所示(这只是一个 sn-p):
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;"
然后在迁移之后我们看到同样的sn-p如下:
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 列,其中一些以没有明显模式的方式出现。两列都是索引。
只要我们实际上不存储任何大于 191 个字符的东西,不变的 event_type 最大长度真的是个问题吗?
我们使用的是 Rails 5.1.3 和 Ruby 2.4.1。
【问题讨论】:
标签: mysql ruby-on-rails