【问题标题】:How to create migrations with specific COLLATE?如何使用特定的 COLLATE 创建迁移?
【发布时间】:2019-11-19 09:43:40
【问题描述】:

我最近在我的开发机器上升级了 Ubuntu,其中包括更新版本的 MySQL,版本 8。

因此,在运行迁移时,由于段错误,我不得不撞到 mysql2 gem。由于 ActiveRecord,它之前被固定到 < 0.5,当时,not being compatible 带有更新版本的 mysql2 gem。

问题是,当我运行迁移时,schema.rb 包含create_tableCOLLATEutf8mb4_0900_ai_ci。这在 MySQL 8 本地很好,但在我们的 CI 或生产服务器上不受支持,因为它们运行的​​是旧版本的 MySQL:

 Mysql2::Error: Unknown collation: 'utf8mb4_0900_ai_ci'

在升级到 MySQL 8 之前,COLLATE 不存在,只有CHARSET

-  create_table "tasks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
+  create_table "tasks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|

在我的 database.yml 中,我将编码指定为 utf8mb4,是否也可以指定 COLLATE

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 rails-activerecord mysql2


    【解决方案1】:

    你可以在database.yml中指定COLLATE

    adapter: mysql2
      encoding: utf8mb4
      collation: utf8mb4_unicode_ci
    

    您可以按如下方式找到您现有的数据库排序规则:

    use my_app_production;
    SELECT @@character_set_database, @@collation_database;
    

    或者一个特定的表:

    SHOW TABLE STATUS LIKE 'users';
    

    顺便说一句,在指定排序规则时,由于段错误消失,也无需碰撞 mysql2 gem。

    【讨论】:

      【解决方案2】:

      您可以更新排序规则:

      ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-13
        • 2015-05-14
        • 2017-02-21
        • 1970-01-01
        • 2015-04-25
        • 2021-02-28
        • 2011-04-08
        • 1970-01-01
        相关资源
        最近更新 更多