mysql-connector-python取二進制字節時報錯UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 0


  在儲存用戶密碼時,我使用了hmac算法對用戶密碼加密,加密出來的hash值是一個二進制字節串,我把這個字節串存到mysql的password字段,password字段的數據類型是varbinary。

  在驗證用戶密碼時,我把用戶輸入的密碼經過同樣的hmac算法得到hash值,然后從數據庫password字段的字節串取出來,比較兩個字節串是否相等。

  在開發環境中,這樣做沒有任何問題,但是當我把代碼部署到centos7的服務器上時,存password字節串沒有問題,卻在取password字段的字節串時出現了UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 0的錯誤。

  其實仔細看一下,這個問題的根源在於mysqlconnector試圖將二進制字節解碼為unicode,也就是字符串,但其實我們是不需要這樣做的,我們只需要將這個二進制字節完完整整地取出來。

  因為我的生產和開發環境的mysql版本不同,因此開發環境中,不需要任何設置mysqlconnector就自動不會對二進制字節進行解碼。我們現在要做的就很簡單,阻止mysqlconnector解碼二進制字節。

  查看mysqlconnector的源碼,在cursor_cext.py找到CMySQLCursor類,這個類的實例就是我們用的cursor,但是這個類的fetchone、fetchall、fetchmany等函數都不接受編碼相關的參數,因此可能不能通過設置cursor來解決,於是我又在官網上找到了connect(連接數據庫的函數)的配置參數說明

  找到use_unicode一項,這個參數控制mysqlconnector在取數據的時候會不會將二進制字節解碼為字符串,它的默認值是True。用法如下

mysql.connector.connect(**config,use_unicode=False)

  這樣取出來的數據類型為<class 'bytes'>,這個錯誤也不會出現了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM