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

bwitn5fc  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(353)

我有一个sql表,其中一列 utf8_unicode_ci 编码,但表本身 latin1_swedish_ci 编码(见 Row StatisticsStructure 第页,共页 phpMyAdmin ).
访问数据库的phpwebapp正确地显示日语文本,但在 phpMyAdmin 一切都是莫吉巴克。webapp(正确)显示日语文本 Xで有名な ,但在 phpMyAdmin 它是 Xã¦ã‚™æœ‰å㪠( hex() 输出为 312E2058C3A3C281C2A6C3A3E2809AE284A2C3A6C593E280B0C3A5C290C28DC3A3C281C2AA ).
用于生成表中数据的应用程序现在已损坏,但我需要添加一些新记录。我怎样才能重现在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文档中列出的所有可能的编码,并对所有可能的组合进行编码/解码,但也没有找到匹配的。知道我错过了什么吗?

0lvr5msh

0lvr5msh1#

为了确保我的角色将被解释为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/

相关问题