查询中文时,mariadb报‘UnicodeEncodeError:'latin-1' codec can't encode character’

最近在测试一个新写API接口时,遇到了一个奇怪的问题:
根据用户名(输入中文)查询用户列表时,devstack环境能够正常执行,但是容器环境就报错。提示’UnicodeEncodeError:’latin-1’ codec can’t encode character u’\u738b’ in positon 310:ordinal not in range(256)’
两个环境上的代码是相同的,区别是devstack使用mysql数据库,容器环境使用mariadb数据库。

根据错误提示,度娘,搜到如下文章:
http://blog.csdn.net/cppdaxue_com/article/details/67638611

    show variables like 'characters%'
    结果如下:
    character_set_client utf8mb4
    character_set_connection utf8mb4
    character_set_database utf8
    character_set_filesystem binary
    character_set_result utf8mb4
    character_set_server utf8
    character_set_system utf8
    character_sets_dir /usr/share/mysql/charsets

   show variables like 'coll%'
  结果如下:
  collation_connection utf8mb4_general_ci
  collation_database utf8_general_ci
  collation_server utf8_general_ci

得到的设置都已经修改为utf8,进一步验证数据库的编码是没问题的。
又搜到了这么一篇文章,
https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
他也是数据库的utf8都设置了,还是插入中文有问题。最后在建立数据库连接时,输入了一个chaset参数,问题解决。 这点让我想起了,我建立连接时输入了一个encoding=’utf-8’,好像没输入chaset这个参数。进一步度娘chaset跟encoding的区别。
发现问题如下:
建立连接的代码如下:

from sqlalchemy import create_engine

database_config = CONF.database.connection
engine = create_engine(database_config,encoding="utf-8",echo=True)

database_config devstack中获取的值为:mysql+pymysql://username:password@127.0.0.1/keystone?charset=utf8
而在容器环境中获取的值为:mysql+pymysql://username:password@127.0.0.1:3306/keystone
看到这里,发现容器环境没有设置字符集,则默认为latin-1

最后附上一篇关于字符集跟编码的文章
https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值