【问题标题】:UnicodeDecodeError in pymssql library of PythonPython的pymssql库中的UnicodeDecodeError
【发布时间】: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”等。他们是英国人。

标签: python pymssql


【解决方案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 
             """)
    

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 2011-11-07
      • 2017-05-03
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2016-01-24
      • 2017-03-22
      相关资源
      最近更新 更多