mysql - 我怎么知道给定的十六进制使用什么编码?

标签 mysql ruby-on-rails utf-8 character-encoding ruby-on-rails-2

我正在将应用程序从 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/

相关文章:

MYSQL - 计算列别名?

mysql - ORDER BY 和 LIMIT 2 个不同的参数

php - 在带有连接的 SELECT 语句之后更新 SQL 表

ruby-on-rails - 如何重写 Rails 路线辅助方法?

javascript - 如何在按键时在没有表单的情况下在数据库中创建记录

ruby-on-rails - 如何将字符串传递给 has_many :finder_sql parameter?

python - lxml.html 解析和带有请求的 utf-8

c# - 简洁的插入语法

ajax - 通过 AJAX 发布时字符编码错误

PHP:替换utf-8字符串中的无效字符