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的主要内容,如果未能解决你的问题,请参考以下文章

Python的pymssql库中的UnicodeDecodeError

如何解析python库中的数据包? [关闭]

python 标准库中的装饰器(特别是@deprecated)

python库中的“更好的选择”,任何列表?

Haversine 函数的 Python 数学库中的错误

使用Cro :: WebSocket :: Client添加授权或标头?