提问人:Trip 提问时间:2/26/2021 最后编辑:mu is too shortTrip 更新时间:4/7/2022 访问量:1726
运行 rails 迁移会覆盖我的字符集。有什么想法吗?
Running a rails migration overwrites my charset. Any ideas why?
问:
我在数据库中将所有内容都设置为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 | |
+--------------------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
答:
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 */;
50503
40101
0赞
Rick James
4/8/2022
@Trip - 该命令是在 4.1.1 (“40101”) 中添加的,但直到 5.5.3 才添加。任一 SET 都将由 4.7 和 8.0 执行。产生了什么产品?SET NAMES
utf8mb4
/!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
评论
rails db:migrate