最近在测试一个新写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