Python的pymssql库中的UnicodeDecodeError
Posted
技术标签:
【中文标题】Python的pymssql库中的UnicodeDecodeError【英文标题】:UnicodeDecodeError in pymssql library of Python 【发布时间】:2018-06-26 06:41:14 【问题描述】:我正在使用 pymssql 从 SQL 服务器获取一些数据并将结果存储在 pandas 数据框中。当我尝试选择包含 utf-8 (Farsi) 字符的列时,我收到此错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 0: invalid continuation byte
但是数据库中的其他列一切正常。
这是我的代码 sn-p,我正在使用 python3.6 运行代码:
import pymssql
import pandas as pd
conn = pymssql.connect(server, username, password, database)
cursor = conn.cursor(as_dict=True)
cursor.execute("""
SELECT id, title
FROM products
""")
df = pd.DataFrame(columns=['id', 'title'])
for row in cursor:
df = df.append(row, ignore_index=True)
conn.close()
【问题讨论】:
[title] 是带有波斯语字符的列吗?如果是这样,SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='products' AND COLUMN_NAME='title'
是否返回 'nvarchar'?
@GordThompson 是的,[title] 包含波斯语字符。您提到的查询返回空结果。
好的,你能用SSMS验证[title]列确实是nvarchar
类型吗?
另外,表名和列名真的是“产品”和“标题”还是更像 N'محصولات' 和 N'عنوان'?
@GordThompson 我在 Ubuntu 上使用 Datagrip 来访问数据库。列名称如“orderId”、“UserId”等。他们是英国人。
【参考方案1】:
您是否 100% 确定数据以 UTF-8 格式存储?运行命令SELECT SERVERPROPERTY('Collation');
应该可以帮助您确定数据在数据库中的编码方式。
我认为默认编码是 Latin-1,这意味着 0xCA 是“大写 E 抑扬符 (Ê)”。
您可以通过将参数 charset="ISO-8859-1"
添加到连接参数来配置 pymssql 以使用该编码访问数据库。
【讨论】:
【参考方案2】:首先在connection上定义charset,如果不是UTF-8,next,nvarchar和varchar。 nvarchar 存储的是 utf-8,varchar 不是。
就我而言,(我有这个和这个在桌子上)我连接:
conn = pymssql.connect(host='xxx', user='xxx',
password='xxx', database='xxx',charset='CP1250')
cur = conn.cursor(as_dict=True)
并且在查询中必须将 nvarchar 转换为 varchar:
cur.execute(
"""SELECT convert(varchar, column) as column
FROM table
""")
【讨论】:
以上是关于Python的pymssql库中的UnicodeDecodeError的主要内容,如果未能解决你的问题,请参考以下文章
使用 pymssql 的 Python/Flask/sqlAlchemy 环境中的 Adaptive Server 连接失败错误
在 Mac OS 10.6 (python 2.6) 上安装/构建 pymssql
Python 学习 第十三篇:数据的读写-文件DataFramejson和pymssql