Python3查询MSSQL返回希腊字符显示乱码问题求助
问题根源
你遇到的是MSSQL数据库返回的Unicode字符被驱动错误解码的问题:
- MSSQL中
NVARCHAR类型的字段默认以UTF-16LE编码存储内容,你使用的Python数据库驱动(pymssql/pyodbc)默认用Latin1(ISO-8859-1)编码解析返回的字节流,因此得到了乱码字符串 - 你对
last_name额外调用了encode('utf-8'),相当于把已经错误解码的字符串再次编码,输出就成了带\xff\xfe(UTF-16LE的BOM标识)的字节串
解决方法
临时快速修复
不需要修改数据库连接配置,直接对返回的字符串做二次编码解码即可得到正确内容:
for row in result: # 还原last_name:把错误编码的字节用UTF-16LE解码 last_name = row[1].encode('utf-8').decode('utf-16le') print('Last Name: ' + last_name) # 还原first_name:先把错误用Latin1解码的字符串转成原始字节,再用UTF-16LE解码 first_name = row[2].encode('latin1').decode('utf-16le') print('First Name: ' + first_name)
永久根治方案
修改数据库连接配置,让驱动自动处理编码转换,不需要每次手动转码:
- 如果你使用
pyodbc连接,在连接字符串中添加ClientCharset=UTF-8和TDS_Version=7.4参数 - 如果你使用
pymssql连接,初始化连接时指定charset='utf8'参数:
import pymssql conn = pymssql.connect( server='你的服务器地址', user='数据库用户名', password='数据库密码', database='数据库名', charset='utf8' )
同时确认MSSQL中存储姓名的字段类型为NVARCHAR而非VARCHAR,后者默认不支持Unicode字符存储。
内容的提问来源于stack exchange,提问作者David Dan
相关产品推荐
相关产品推荐

