使用Python cx_Oracle库查询时解码错误
我在使用pd.read_sql时遇到解码错误。我正在查询Oracle数据库,并使用cx_Oracle库 我已尝试在Oracle连接字符串中传递编码参数,如下所示 cx\u oracle.connect(user=user\u name,password=pwd,dsn=dsn\u tns,encoding=“UTF-8”) 每次运行pd.read_sql时,我都会尝试编码选项并出错,如下所示:使用Python cx_Oracle库查询时解码错误,python,oracle,encoding,utf-8,cx-oracle,Python,Oracle,Encoding,Utf 8,Cx Oracle,我在使用pd.read_sql时遇到解码错误。我正在查询Oracle数据库,并使用cx_Oracle库 我已尝试在Oracle连接字符串中传递编码参数,如下所示 cx\u oracle.connect(user=user\u name,password=pwd,dsn=dsn\u tns,encoding=“UTF-8”) 每次运行pd.read_sql时,我都会尝试编码选项并出错,如下所示: 当encoding='UTF-8'时,错误为UTF-8'编解码器无法解码字节 0xc3位于位置34:数
谢谢如果您有损坏的数据,请尝试cx\U Oracle文档中建议的方法:
如果您有损坏的数据,请尝试cx_Oracle文档中建议的方法:
首先需要确定服务器设置为的字符集:
SELECT value
FROM nls_database_parameters
WHERE parameter in ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
然后设置.connect()
的encoding
和nencoding
参数,使客户端与服务器匹配。(服务器上的AL32UTF8与客户端上的UTF-8匹配)
如果列的类型为nvarchar
、nclob
等,则还需要使用nencoding
参数。但是您没有发布列数据类型,也没有发布查询
cx_oracle.connect(user=user_name, password=pwd, dsn=dsn_tns, encoding="UTF-8", nencoding="UTF-8")
如果您的服务器确实是
AL32UTF8
,并且cx\u oracle仍然会在encoding
设置为UTF-8
时给您一个解码错误,那么正如另一个答案所说,您的数据已损坏。通过查询不同的较小行集进行测试。首先需要确定服务器设置为的字符集:
SELECT value
FROM nls_database_parameters
WHERE parameter in ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
然后设置.connect()
的encoding
和nencoding
参数,使客户端与服务器匹配。(服务器上的AL32UTF8与客户端上的UTF-8匹配)
如果列的类型为nvarchar
、nclob
等,则还需要使用nencoding
参数。但是您没有发布列数据类型,也没有发布查询
cx_oracle.connect(user=user_name, password=pwd, dsn=dsn_tns, encoding="UTF-8", nencoding="UTF-8")
如果您的服务器确实是
AL32UTF8
,并且cx\u oracle仍然会在encoding
设置为UTF-8
时给您一个解码错误,那么正如另一个答案所说,您的数据已损坏。通过查询不同的较小行集进行测试。哪个Python版本?你的代码看起来像什么?如果删除任何编码参数,会发生什么情况?Python3字符串是Unicode的,因此不需要编码。当数据库字段为UTF8时,使用UTF16
只能保证出错输入是什么样子的,从哪里来的?很可能它已经包含无效字符。如果您从文件中加载了一些单字节文本,并试图将其原样传递到数据库,则所有值>127的字节在UTF8中都无效encoding@PanagiotisKanavos:Python版本为3.7。删除编码参数会导致UTF-8错误。@PanagiotisKanavos:输入是从现有数据库加载到Oracle数据库的。它不是从文件中加载的。这些是一些示例数据。顺便说一句,该错误意味着数据不是UTF8。因此,您必须发布一个createtable
语句和INSERT
子句,创建一个带有特定编码字段的表,以及测试数据,人们可以使用这些数据完全重现问题。也许问题在于ORACLE HOME中的硬编码非UTF8编码?哪个Python版本?你的代码看起来像什么?如果删除任何编码参数,会发生什么情况?Python3字符串是Unicode的,因此不需要编码。当数据库字段为UTF8时,使用UTF16
只能保证出错输入是什么样子的,从哪里来的?很可能它已经包含无效字符。如果您从文件中加载了一些单字节文本,并试图将其原样传递到数据库,则所有值>127的字节在UTF8中都无效encoding@PanagiotisKanavos:Python版本为3.7。删除编码参数会导致UTF-8错误。@PanagiotisKanavos:输入是从现有数据库加载到Oracle数据库的。它不是从文件中加载的。这些是一些示例数据。顺便说一句,该错误意味着数据不是UTF8。因此,您必须发布一个createtable
语句和INSERT
子句,创建一个带有特定编码字段的表,以及测试数据,人们可以使用这些数据完全重现问题。也许问题在于ORACLE HOME中的硬编码非UTF8编码?我认为这不是损坏的数据,而是非英语字符的数据。像这样“惠州市", "Фааа,“plynárenský”。所以我不应该取代他们。我应该可以按原样阅读。@ashasasidharan您正在阅读的页面是UTF8,但是您不必做任何事情来发布这些非英语字符。我认为这不是损坏的数据,而是非英语字符的数据。像这样“惠州市", "Фааа,“plynárenský”。所以我不应该取代他们。我应该能够按原样阅读它们。@ashasasidharan您正在阅读的页面是UTF8,但您不必做任何事情来发布这些非英语字符。