mysql - 在 mysql 表中重新创建编码混合

标签 mysql encoding character-encoding mojibake

我有一个 sql 表,其中一列具有 utf8_unicode_ci 编码,但表本身具有 latin1_swedish_ci 编码(如 Row stats 中报告的) phpMyAdminStructure 选项卡)。

访问数据库的 PHP Web 应用程序可以正确显示日语文本,但在 phpMyAdmin 中,所有内容都是 mojibake 。 Web 应用程序(正确地)显示日语文本 Xで有名な,但在 phpMyAdmin 中,它是 Xãã‚™æœeqå㪠(hex() 输出为 312E2058C3A3C281C2A6C3A3E2809AE284A2C3A6C593E280B0C3A5C290C28DC3A3C281C2AA)。

用于生成表中数据的应用程序现在已损坏,但我需要添加一些新记录。如何重新创建表中找到的 mojibake?

我尝试用 python 重现 mojibake:

def rev_engineer(utf8):
    mojibake = utf8.encode('utf8').decode('latin1')
    print(mojibake)

rev_engineer('Xで有名な')
# output:    Xã¦ãæåãª
# should be: Xã¦ã‚™æœ‰åãª

这显然非常相似,但又不完全相似。然后,我尝试循环遍历 python 文档中列出的每种可能的编码,并对每种可能的组合进行编码/解码,但也没有找到匹配的结果。知道我错过了什么吗?

最佳答案

为了确保我的字符将被解释为 UTF8 序列

test> set names utf8 ;
Query OK, 0 rows affected (0.00 sec)

检查我是否有 2 个字节用于 é

test> select hex(binary('é')) ;
+-------------------+
| hex(binary('é')) |
+-------------------+
| C3A9              |
+-------------------+
1 row in set (0.00 sec)

检查我是否具有相同的值

test ]> select convert(binary(convert(convert(unhex('312E2058C3A3C281C2A6C3A3E2809AE284A2C3A6C593E280B0C3A5C290C28DC3A3C281C2AA') using utf8 ) using latin1 )) using utf8 );
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| convert(binary(convert(convert(unhex('312E2058C3A3C281C2A6C3A3E2809AE284A2C3A6C593E280B0C3A5C290C28DC3A3C281C2AA') using utf8 ) using latin1 )) using utf8 ) |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1. Xで有名な                                                                                                                                          |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

通过复制/粘贴输出字符串,我可以反转该过程

test > select hex(convert (convert(binary('1. Xで有名な  ') using latin1 ) using utf8 )) ;
+---------------------------------------------------------------------------------+
| hex(convert (convert(binary('1. Xで有名な') using latin1 ) using utf8 )) |
+---------------------------------------------------------------------------------+
| 312E2058C3A3C281C2A6C3A3E2809AE284A2C3A6C593E280B0C3A5C290C28DC3A3C281C2AA      |
+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

如果您有几行要插入,请使用 pphpmyadmin 插入行,如果它不能直接通过命令 mysql 工作。

如果你想使用Python,你可以使用这个模块: https://pypi.org/project/mysql-latin1-codec/

关于mysql - 在 mysql 表中重新创建编码混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51680733/

相关文章:

php - 学说条件连接

php - 如何基于三张表显示注册类(class)

powershell - PowerShell 的 UTF-8 输出

mysql - 为什么远程服务器mysql命令行无法输入汉字而本地却可以

Capital ÅÄÖ 打印不正确

awk 降低以重音符号开头的字符串 - 支持外来字符

mysql - 按 "today"、 "in last 7 days"、 "in last month"和 "older"对查询结果进行分组

php - 我可以在 MySQL 更新中增加日期字段吗?

java - 在 Java 中仅对查询键和参数进行 url 编码的最佳方法是什么?

sql-server - 在 SQL Server 2012 中将 varbinary() 转换为 varchar(max) 时如何编码特定语言的字符?