我正在将应用程序从 rails 2.3 升级到 rails 5。我们遇到的一个问题是 db 上的编码,我们使用的是 mysql。
在 rails 2.3 应用程序中,如果您在数据库中查询我们的字段,您会得到有效的符号,例如:
€
如果你直接查看数据库:
€
检查十六进制表示
select HEX(txt) from table;
+----------------+
| HEX(txt) |
+----------------+
| C3A2E2809AC2AC |
+----------------+
1 row in set (0.00 sec)
如果我在应用程序的 Rails 5 版本上保存完全相同的字符,当直接查询数据库时,我在数据库上得到了正确的值。
对于十六进制的长度,我认为它是 utf-16 但不是:
SELECT CHAR(0xC3A2E2809AC2AC USING utf16);
+-----------------------------------+
| CHAR(0xC3A2E2809AC2AC USING utf16) |
+-----------------------------------+
| 肚슬 |
+-----------------------------------+
1 row in set (0.00 sec)
现在,如果我知道 0xC3A2E2809AC2AC 代表一个 €,就可以知道该表示在哪个字符集中是准确的吗?
我认为 mysql 适配器 mysql (2.8.1) 正在做一些转换,但我找不到任何关于此的文档。
字段排序规则是utf8_general_ci
,db字符集是utf8
。
最佳答案
不,这不是欧元符号的正确编码,至少不是直接编码。
被视为 utf8,C3A2 E2809A C2AC
(添加了空格)是 €
。但是撤消“双重编码”(即通过 latin1 转换两次),你会得到 €
:
CONVERT(BINARY(CONVERT(CONVERT(UNHEX('C3A2E2809AC2AC')
USING utf8mb4)
USING latin1))
USING utf8mb4) --> '€'
(在这种情况下,utf8 和 utf8mb4 将产生相同的结果。)
更多讨论,搜索“double” Trouble...和 Here .两者都为系统和数据提供了可能的修复。
原始问题
从表面上看,您的编码是 utf8。但是,由于“双重编码”,该结论具有误导性。请参阅上面第二个链接中的“诊断字符集问题”部分。
关于mysql - 我怎么知道给定的十六进制使用什么编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41748899/