解決mysql中表字符集gbk,列字符集Latin1,python查詢亂碼問題

最近在公司碰到一個異常蛋疼的狀況,mysql數據庫中,數據庫和表的字符集都是'gbk',可是列的字符集倒是'latin1',因而蛋疼的事情出現了。mysql

不管我鏈接字符串的`charset`設置爲`gbk`,`utf8`,`latin1`中的任意一種,查詢出來的表中數據的中文都是亂碼,在查詢中加上以下代碼也仍是無濟於事:sql

 SET NAMES latin1 
 
在更換各類py連接庫,而後瘋狂的google和問了各路大神以後,終於找到解決思路以下:
一、經過hex(column)將列中的數據2進制轉爲16進制字符串表示,而後返回給py
二、py經過2次decode操做,將hex字符串轉爲Unicode編碼
三、最後進行一次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,最後得到咱們須要的字符串,最後再次譴責哪一個坑爹設計了這樣的數據庫。數據庫

相關文章
相關標籤/搜索