在 mysql table 中重新创建编码混淆
recreate encoding mixup in mysql table
我有一个 sql table,其中一列具有 utf8_unicode_ci
编码,但 table 本身具有 latin1_swedish_ci
编码(如 [= phpMyAdmin
的 Structure
选项卡中的 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/
我有一个 sql table,其中一列具有 utf8_unicode_ci
编码,但 table 本身具有 latin1_swedish_ci
编码(如 [= phpMyAdmin
的 Structure
选项卡中的 15=])。
访问数据库的 PHP webapp 正确显示日语文本,但在 phpMyAdmin
里面一切都是 mojibake。 Web 应用程序(正确)显示日语文本 Xで有名な
,但在 phpMyAdmin
中它是 Xã¦ã‚™æœ‰åãª
(hex()
输出是 312E2058C3A3C281C2A6C3A3E2809AE284A2C3A6C593E280B0C3A5C290C28DC3A3C281C2AA
)。
用于在 table 中生成数据的应用程序现已损坏,但我需要添加一些新记录。如何重新创建 table?
中的 mojibake我尝试用 python:
重现 mojibakedef 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/