标签:
用python的pymssql模块读取旧业务系统后台SQL Server 2000数据库展示数据为乱码
数据库的[rooms]表记录一些功能房间列表,与其他接口数据进行对比,然后输出对比结果。
rooms表结构:
CREATE TABLE [rooms] ( [id] [int] IDENTITY (1, 1) NOT NULL , [name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , PRIMARY KEY CLUSTERED ([id] ON [PRIMARY] , UNIQUE NONCLUSTERED ([des]) ON [PRIMARY] ) ON [PRIMARY] GO
模拟代码
# -*- coding: utf-8 -*-
import pymssql
rooms=None
with pymssql.connect(host=‘192.168.1.100‘,database=‘builds‘,
user=‘sa‘,password=‘password‘,
# charset=‘utf8‘,
) as conn:
cur=conn.cursor()
sql="select id,name from rooms"
cur.execute(sql)
rooms=cur.fetchall()
if rooms and isinstance(rooms,(list,tuple)):
for room_id,room_name in rooms:
print "\t".join([str(room_id),room_name])
在通用环境中运行代码,room_name变量列显示乱码
# 注意此时输出标记为u,说明识别为unicode编码,正常时此时print出是真实值
>>> room_name
u‘\xbf\xec\xb5\xdd\xbc\xe4\xa3\xa8\xc3\xc5\xc4\xda\xa3\xa9‘
# 打印原始值为乱码,所以怀疑实际存储的是被标记为unicode的其他编码
>>> print room_name
¿ìµÝ¼ä£¨ÃÅÄÚ£©
# 这时可以将引号内赋值,再使用chardet.detect()判断
>>> aa=‘\xbf\xec\xb5\xdd\xbc\xe4\xa3\xa8\xc3\xc5\xc4\xda\xa3\xa9‘
>>> aa
‘\xbf\xec\xb5\xdd\xbc\xe4\xa3\xa8\xc3\xc5\xc4\xda\xa3\xa9‘
# 果然,检测出的结果是GB2312编码
>>> chardet.detect(aa)
{‘confidence‘: 0.99, ‘encoding‘: ‘GB2312‘}
# 输出正常
>>> print aa.decode(‘gb2312‘)
快递间(门内)
# 此时,需要unicode->encode(‘Latin1‘)->decode(‘GB2312‘)
>>> room_name.encode(‘latin1‘).decode(‘GB2312‘)
u‘\u5feb\u9012\u95f4\uff08\u95e8\u5185\uff09‘
>>> print room_name.encode(‘latin1‘).decode(‘GB2312‘)
快递间(门内)
pymssql基础实现使用的是cpython,从GitHub的官方代码文件_mssql.pyx,可以看到一些处理过程。使用strcpy函数对数据交换,因为对cpython不了解,怀疑是在处理双字节文字转码时的一点bug。
这个问题有两个解决办法:
print "\t".join([str(room_id),room_name.encode(‘latin1‘).decode(‘gbk‘)])
[room_name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
原文:这里
参考:
1)"UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence"
2)水木社区:用pymssql的时候出现了很诡异的字符集问题
标签:
原文地址:http://www.cnblogs.com/ivistn/p/4455096.html