在服务器部署了“邮件定时任务”时,在触发发送时,一直报错编码错误,
INFO:sqlalchemy.engine.base.Engine:{'temp_id_1': 1, 'param_1': 1}
ERROR:root:'ascii' codec can't encode characters in position 11-16: ordinal not in range(128)
【原因分析】:定时任务的邮件内容存储于数据库中,使用的是“中文”存储,服务器读取时,由于服务器系统配置问题,中文转码读取出错;
【解决办法】:
1、配置系统编码 (然而网上找了好久方法,没有实现)
2、改变存储格式
【解决办法 1 】
找了网上很多解决办法,都无效(也许是我使用的不对)
比如:
解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 问题(转)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-11: ordinal not in range(128)
解决UnicodeEncodeError: 'ascii' codec can't encode characters in position
转自:http://cooler1217.iteye.com/blog/1465335
异常: 'ascii' codec can't encode characters
字符集的问题,在文件前加两句话:
reload(sys)
sys.setdefaultencoding( "utf-8" )
完美解决,ok
另外(非转载):1. 当字符串里有 \n、\t、\r时,json.loads()失效,异常,要去掉;
2. 在操作数据库的时候用到 BasicDataSource 时,可以通过设置characterEncoding来解决中文乱码的问题,
BasicDataSource connPool;connPool.addConnectionProperty("characterEncoding", "UTF-8");;
http://blog.csdn.net/junshao90/article/details/7974030
使用以上办法,实测无效,
【解决办法2】
在数据存储到数据库前,先进行 json.dumps() 转码,再存入数据库。(这样很好的解决了,很多摸不着头脑的字符转码问题)
【其他收获】
数据库中存储一些python数据格式,比如 list、tuple、dict 等等数据,存储时,以前是用 字符串 格式存储,然后,在读取时,是用 eval() 来进行转换。(这个方法有点风险)
如果 通过 JSON 转码后再存储,有以下优势:
1)既解决了,中文字符转码问题 (通用的ascii,有很好的的兼容性)
2)又解决了 保留 原始数据类型的问题, 读取后 json.loads() 转出来,直接就是原来的数据类型数据格式
3)节省存储空间
劣势:
内容模糊搜索查询比较麻烦?