我正在尝试使用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_LANGos.environ['NLS_LANG'] = 'AMERICAN_AMERICA.US7ASCII'
但会导致相同的错误
这些是数据库NLS参数:
NLS_CHARACTERSET US7ASCII
NLS_NCHAR_CHARACTERSET AL16UTF16
我在访问中运行了相同的查询,我在查询结果中发现了这个字符,这可能会导致此问题:
¿
基本上,我不知道如何设置正确的编码来处理问题。任何帮助表示赞赏。谢谢。
SOLUTION:
作为参考,我通过设置
解决了这个问题os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.UTF8'
我不喜欢这样做。我们赞赏更好的解决方案。
答案 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 - 出于历史原因!