python與sqlite處理中文字元時出現的編碼錯誤問題解決
python編碼如果把中文資料儲存至sqlite資料庫某一欄位中,再通過查詢語句取出並進行相關的字串操作時,經常會出現錯誤提示,類似於UnicodeDecodeError,提示某一型別編碼不能轉換。
出現這個問題的原因是因為python預設使用unicode處理sqlite3的TEXT型別(varchar型別也是如此,因為在sqlite中varchar其實就是TEXT)。python把中文存入資料庫時使用了類似於GBK這樣的編碼,取出時會嘗試把TEXT型別資料轉換成unicode,從而出現錯誤。
由此導致的另一個不容易發現的錯誤是儲存在資料庫中的中文進行了base64之類的編碼,在python中取出時不會存在錯誤,但是再進行base64解碼,並與sqlite3中取出的其它text欄位進行字串拼接等處理,就出現編碼轉換錯誤,很難發現問題原因,可以把其它text欄位進行如'aaa'.encode('gbk')編碼成GBK碼解決,但不提倡這種方法,更好方法如下:
解決方法是python連線sqlite資料庫後進行如下設定:
conn = sqlite3.connection(“……”)
conn.text_factory = str
另外為了python程式碼中硬編碼的中文字串不出現問題,除了在原始碼開始新增
# -*- coding:utf-8 -*-
還要設定python原始碼的編碼為utf-8
import sys
reload(sys)
sys.setdefaultencode('utf8')