python读取SQL server中文乱码处理

环境
  • 开发机win10,chcp 936,记E1。
  • 服务器server 2012,chcp 936,记E2。
  • 数据库sqlserver
  • 表1,varchar,记T1。
  • 表2,nvarchar,记T2。
问题描述

一个python数据处理脚本,功能是一些数据存储操作。使用了pandassqlalchemy做数据库连接。

E1上,任何情况均运行正常。

E2上,出现中文乱码:

  • 数据库连接使用charset=utf8,T1乱码,T2正常。
  • 数据库连接使用charset=GBK,T1正常,T2空值。
  • 数据库连接不使用charset,T1乱码,T2正常。
相关知识点
  1. varchar在sqlserver中,采用单字节存储。
  2. nvarchar在sqlserver中,采用双字节存储。
  3. nvarcharvarchar占空间,但灵活性好。
解决方案
  1. 对乱码的字符串变量,做转换。xxx.encode('latin-1').decode('gbk'))。但这样做就导致这段代码在E2上正常,E1上异常。不方便维护。
  2. 不使用charset或者charset=utf8,然后修改sql语句。将varchar类型的字段使用convert(nvarchar(20), features_name) as features_name做编码转换。跑下来在两台机器上没问题。
疑惑

至今没有搞清楚,为什么同一套代码在两台机器上无法同时正确运行。在E1上,无论何种设置,均能正确获取中文数据,而在E2上则不行。
我感觉应该是两台机器的环境问题,大概率是编码之类的。但是目前没有头绪。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值