最近在公司碰到一个异常蛋疼的情况,mysql数据库中,数据库和表的字符集都是'gbk',但是列的字符集却是'latin1',于是蛋疼的事情出现了。
无论我连接字符串的`charset`设置为`gbk`,`utf8`,`latin1`中的任意一种,查询出来的表中数据的中文都是乱码,在查询中加上如下代码也还是无济于事:
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,最后获得我们需要的字符串,最后再次谴责哪个坑爹设计了这样的数据库。