utf8mb4 的 MySQL 迁移创建了不一致的模式

标签 mysql ruby-on-rails

我们意识到将 MySQL 5.7.20 上的字符集设置为 utf8 实际上并不会存储所有 unicode/emoji 字符。我们正在测试将字符集迁移到 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 列,其中一些以没有明显模式的方式出现。两列都是索引。

只要我们实际上不在其中存储超过 191 个字符的任何内容,不变的 event_type 最大长度真的是个问题吗?

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

最佳答案

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

关于utf8mb4 的 MySQL 迁移创建了不一致的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48797980/

相关文章:

javascript - 将我的应用程序从 ruby​​/rails 重写为 javascript/express。 mongodb 能满足我的需求吗?

javascript - rails 5 : allow javascript posted image from controller

mysql - MySQL 表中最多可以有多少列?

mysql - C MySQL 类型错误

php - 从表中选择多行并在按钮单击上应用函数

ruby-on-rails - 解析 JSON 时出错 : undefined method 'gsub'

ruby-on-rails - 更新记录后,Active Admin 需要强制刷新

PHP/SQL 存储表单完成后当前登录用户的名称

java - 回复 : jdbc driver for MySQL cannot be found from WEB-INF/lib directory

javascript - JQuery onchange 不起作用