环境
- 开发机win10,chcp 936,记E1。
- 服务器server 2012,chcp 936,记E2。
- 数据库sqlserver
- 表1,varchar,记T1。
- 表2,nvarchar,记T2。
问题描述
一个python数据处理脚本,功能是一些数据存储操作。使用了pandas
、sqlalchemy
做数据库连接。
E1上,任何情况均运行正常。
E2上,出现中文乱码:
- 数据库连接使用
charset=utf8
,T1乱码,T2正常。 - 数据库连接使用
charset=GBK
,T1正常,T2空值。 - 数据库连接不使用
charset
,T1乱码,T2正常。
相关知识点
varchar
在sqlserver中,采用单字节存储。nvarchar
在sqlserver中,采用双字节存储。nvarchar
比varchar
占空间,但灵活性好。
解决方案
- 对乱码的字符串变量,做转换。
xxx.encode('latin-1').decode('gbk'))
。但这样做就导致这段代码在E2上正常,E1上异常。不方便维护。 - 不使用
charset或者charset=utf8
,然后修改sql语句。将varchar
类型的字段使用convert(nvarchar(20), features_name) as features_name
做编码转换。跑下来在两台机器上没问题。
疑惑
至今没有搞清楚,为什么同一套代码在两台机器上无法同时正确运行。在E1上,无论何种设置,均能正确获取中文数据,而在E2上则不行。
我感觉应该是两台机器的环境问题,大概率是编码之类的。但是目前没有头绪。