zoukankan      html  css  js  c++  java
  • 解决mysql中表字符集gbk,列字符集Latin1,python查询乱码问题

    最近在公司碰到一个异常蛋疼的情况,mysql数据库中,数据库和表的字符集都是'gbk',但是列的字符集却是'latin1',于是蛋疼的事情出现了。

    无论我连接字符串的`charset`设置为`gbk`,`utf8`,`latin1`中的任意一种,查询出来的表中数据的中文都是乱码,在查询中加上如下代码也还是无济于事:

     SET NAMES latin1 
     
    在更换各种py链接库,然后疯狂的google和问了各路大神之后,终于找到解决思路如下:
    1、通过hex(column)将列中的数据2进制转为16进制字符串表示,然后返回给py
    2、py通过2次decode操作,将hex字符串转为Unicode编码
    3、最后进行一次encode,将结果转为utf8响应出去
    伪代码如下:
    def hex2char(hexString):
            output = hexString.decode('hex').decode('gbk').encode('utf8')
            return output
    ...
    sqlStr = "SELECT acc_name,level_n,hex(char_name)  FROM roles where acc_name='noc20'"
    cur.execute(sqlStr)
    for c in cur:
        char_name = hex2char(c[2])
    ...

    最后分析一下为什么之前,设置charset='gbk',然后对查询结果直接decode('gbk')无法操作的原因,因为数据库字符集和表的字符集都是`gbk`,所以数据库链接我们这里必须设定为`gbk`,但是由于我们需要获取的列名字符集被坑爹的设置成`latin1`,所以查询返回的字符串其实就是以`latin1`编码的,实质上是`gbk`的字符串,当然使用任意一种decode都是无法正确转换的,只有将字符串转为2进制表示,才能无损的从数据库读出数据,而`hex`操作正巧帮我们无损的从数据库将数据读出,然后就顺利成章的进行2次decode,最后获得我们需要的字符串,最后再次谴责哪个坑爹设计了这样的数据库。

  • 相关阅读:
    每日总结32
    每日总结31
    每日总结30
    Leetcode 115. 不同的子序列(二维DP)
    Leetcode 59. 螺旋矩阵 II
    Leetcode 227. 基本计算器 II
    macOS下将GitHub中单个子文件夹下载到本地
    P3796 【模板】AC自动机(加强版)
    P3808 【模板】AC自动机(简单版)
    【Kubernetes】副本的删除
  • 原文地址:https://www.cnblogs.com/WillZhang7/p/4262833.html
Copyright © 2011-2022 走看看