运行 rails 迁移会覆盖我的字符集。有什么想法吗?

Running a rails migration overwrites my charset. Any ideas why?

提问人:Trip 提问时间:2/26/2021 最后编辑:mu is too shortTrip 更新时间:4/7/2022 访问量:1726

问:

我在数据库中将所有内容都设置为utf8mb4:

mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+```

我的database.yml [ 我在创建添加了编码/排序规则]。但是我确实将所有表和数据库更新为utf8mb4。

development:
  adapter: mysql2
  encoding: utf8mb4
  collation: utf8mb4_general_ci

当我运行任何命令时,每个表的导出总是如下所示:rails db:migrate

-/*!50503 SET character_set_client = utf8mb4 */;
+/*!40101 SET character_set_client = utf8 */;

我可以检查这些单独的表中的任何一个,看看它们确实是 utf8mb4(但仅限于某些行。也许这是一个问题?) :

mysql> show full columns from ab_experiment_buckets;
+--------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field              | Type         | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+--------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id                 | int(11)      | NULL               | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| foobar_id   | int(11)      | NULL               | NO   |     | NULL    |                | select,insert,update,references |         |
| foobar_nam        | varchar(255) | utf8mb4_general_ci | NO   |     | NULL    |                | select,insert,update,references |         |
| foobar_index       | int(11)      | NULL               | NO   |     | NULL    |                | select,insert,update,references |         |
| foobar_probability | float        | NULL               | NO   |     | NULL    |                | select,insert,update,references |         |
| foobar_value       | text         | utf8mb4_general_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| created_at         | datetime     | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
| updated_at         | datetime     | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
| foobar_is_default         | tinyint(1)   | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
+--------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
mysql ruby-on-rails utf-8 排序规则 utf8mb4

评论

0赞 eux 3/30/2021
您使用的是哪个版本的 Rails?默认情况下,它是 Rails 6 中 MySQL 数据库的 utf8mb4 字符集
0赞 Trip 3/31/2021
@eux轨 6.我最终完全重新安装了 SQL 和 mysql-client,这让我几乎完成了剩下的工作。
0赞 Trip 4/6/2022
不得不重新安装 mySQL,现在我又在同一条船上。
0赞 Rick James 4/7/2022
请显示举例说明问题的查询。
0赞 Trip 4/8/2022
嘿@RickJames,感谢您的回复和回答。查询本身只是 .转储的结构 .sql 基本上就是我的数据库。但事实果真如此吗?如果每个细节都指向 utf8-mb4,为什么还要导出 UTF-8。rails db:migrate

答:

0赞 Rick James 4/7/2022 #1

你有这样的东西吗?

  def configure_charsets
    response.headers["Content-Type"] = "text/html; charset=UTF-8"
    suppress(ActiveRecord::StatementInvalid) do
      ActiveRecord::Base.connection.execute 'SET NAMES utf8mb4'
    end
  end

和/或

dataSource:
    dbCreate: "update"
    url: "jdbc:mysql://localhost:8889/mydbname?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true"

上面的“UTF-8”是故意的;它不应该是“UTF8MB4”,反之亦然。

你用吗?它可能会引起麻烦。rake db:reset

UTF-8 字符的问题;我看到的不是我存储的内容可能有助于解决特定症状。

评论

0赞 Trip 4/8/2022
对猴子扳手输出不是特别感兴趣。过去我确实通过重新安装我的mysql-client来工作。但是我买了一个新的 M1,重新安装了所有相同的 sql 7.5.3 和 mysql-client 8。完全相同的数据库。从字面上看,只是移植过来。相同版本的 sql 和客户端。又回到了老问题。
0赞 Trip 4/8/2022
因为你是一个SQL天才。我认为这是很大的提示。 当我运行迁移时,它将版本 min 替换为 .这让我认为客户端或 sql 的版本要么被误解、忽略,要么我使用的是更旧的版本(不知何故),然后我被引导相信。除了较旧的 SQL 之外,什么会导致重写?我正在使用版本 mysql 5.7.36 和 mysql-client 8.0.28-/*!50503 SET NAMES utf8mb4 /; +/!40101 SET NAMES utf8mb4 */;5050340101
0赞 Rick James 4/8/2022
@Trip - 该命令是在 4.1.1 (“40101”) 中添加的,但直到 5.5.3 才添加。任一 SET 都将由 4.7 和 8.0 执行。产生了什么产品?SET NAMESutf8mb4/!40101 SET NAMES utf8mb4 */
0赞 Trip 4/19/2022
该产品是 Rails 的 ActiveRecord。具体来说,正是这个文件正在执行 ORM github.com/rails/rails/blob/main/activerecord/lib/active_record/......
0赞 Trip 4/19/2022
或者,如果你问mysql是什么产品,版本是mysql 5.7.36