使用read_sql时的Pandas UnicodeDecodeError

时间:2018-03-15 22:22:01

标签: python oracle pandas cx-oracle

我正在尝试使用pandas.read_sql执行SQL查询。它通常有效,但对于某些查询,我遇到了这个错误:

  File "C:\Anaconda3\lib\site-packages\pandas\io\sql.py", line 1454, in _fetchall_as_list
    result = cur.fetchall()

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xb4 in position 3: ordinal not in range(128)

我在这里尝试了针对非常类似问题的解决方案(UnicodeDecodeError with pandas.read_sql),但它没有解决问题。

我正在使用cx_oracle库进行数据库连接。

我试过

db = cx_Oracle.connect(user,pwd, dsn_dict[dbname],encoding='utf-8')

但是当我使用

检查编码时
print(db.encoding)
print(db.nencoding)

我总是得到

ASCII
ASCII

我尝试使用

更改NLS_LANG
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.US7ASCII'

但会导致相同的错误

这些是数据库NLS参数:

NLS_CHARACTERSET    US7ASCII

NLS_NCHAR_CHARACTERSET  AL16UTF16

我在访问中运行了相同的查询,我在查询结果中发现了这个字符,这可能会导致此问题:

¿

基本上,我不知道如何设置正确的编码来处理问题。任何帮助表示赞赏。谢谢。

SOLUTION:

作为参考,我通过设置

解决了这个问题
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.UTF8'

我不喜欢这样做。我们赞赏更好的解决方案。

1 个答案:

答案 0 :(得分:0)

使用cx_Oracle 6这应该适合你:

cx_Oracle.connect(“user / pw @ dsn”,encoding =“UTF-8”,nencoding =“UTF-8”)

由于您的数据库编码是ASCII,您甚至可以设置nencoding参数。如果您要使用NLS_LANG环境变量,请确保使用真正的UTF-8编码。这在Oracle中称为AL32UTF8 - 出于历史原因!