我有一个 sql 表,其中一列具有 utf8_unicode_ci
编码,但表本身具有 latin1_swedish_ci
编码(如 Row stats
中报告的) phpMyAdmin
的 Structure
选项卡)。
访问数据库的 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/