在 mysql table 中重新创建编码混淆

recreate encoding mixup in mysql table

我有一个 sql table,其中一列具有 utf8_unicode_ci 编码,但 table 本身具有 latin1_swedish_ci 编码(如 [= phpMyAdminStructure 选项卡中的 15=])。

访问数据库的 PHP webapp 正确显示日语文本,但在 phpMyAdmin 里面一切都是 mojibake。 Web 应用程序(正确)显示日语文本 Xで有名な,但在 phpMyAdmin 中它是 Xã¦ã‚™æœ‰åãªhex() 输出是 312E2058C3A3C281C2A6C3A3E2809AE284A2C3A6C593E280B0C3A5C290C28DC3A3C281C2AA)。

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

中的 mojibake

我尝试用 python:

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

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

这显然非常相似,但又不完全相同。然后,我尝试遍历 python 文档中列出的每个可能的编码,以及 encoding/decoding 每个可能的组合,但也没有找到匹配项。知道我错过了什么吗?

确保我的字符将被解释为 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)

通过copy/paste输出字符串,我可以反转这个过程

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/