在储存用户密码时,我使用了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'>,这个错误也不会出现了

最新文章

  1. proc文件系统在内核中的表现
  2. sql 事务使用
  3. 在线白板,基于socket.io的多人在线协作工具
  4. 540B :School Marks
  5. vijos 1464 NOIP 1997 积木游戏
  6. js JSONP实例
  7. 基于visual Studio2013解决面试题之1102合并字符串
  8. Hybris商品图片导入与压缩有关的配置
  9. vue的爬坑之路-------axios中this的指向问题
  10. 我们为什么要搞长沙.NET技术社区(4)
  11. python中表示False的一些内置对象
  12. vue 路由传参 params 与 query两种方式的区别
  13. MHA 报错:There is no alive slave. We can&#39;t do failover
  14. 【repost】Chrome 控制台console的用法
  15. [数学] 将长为L的木棒随机折成3段,则3段构成三角形的概率
  16. myql --- mysqldump使用方法
  17. 构造函数详解,explicit,初始化列表
  18. 准备你的 In-app Billing 程序
  19. BZOJ 1066 [SCOI2007]蜥蜴(最大流)
  20. @angular/cli项目构建--interceptor

热门文章

  1. linux设置时区和自动同步时间
  2. Java中int与String间的类型转换
  3. DateTime Toxxx() 方法获取时间
  4. oracle 11g用户名的大小写问题
  5. elasticsearch 第三篇(安装篇)
  6. 【JavaScript】简介、&lt;Script&gt;标签及基本概念
  7. 【bzoj4036】按位或
  8. UESTC--1682
  9. NYOJ--520
  10. jetBrains 插件开发第一课-- 在主菜单栏新增一个菜单