Sqlalchemy CLOB在Windows和Mac上返回不同的结果

问题描述:

给定以下代码 windows上的输出具有完整的8位字节,因为在Mac上,该字符串已被编码为7位ASCII,其编码看起来像“替换”。Sqlalchemy CLOB在Windows和Mac上返回不同的结果

MAC 25 50 44 46 2D 31 2E 33 0A 25 43 69 3F 3F 0A 35 20 30 20 6F 62 6A 0A 3C图3C 2F

WINDOWS 25 50 44 46 2D 31图2e 33 0A 25 C7 EC 8F A2 0A 35 20 30 20 6F 62 0A 6A 3C图3C 2F

我有SQLAlchemy的,蟒,CX-Oracle和即时客户的同一版本安装

我已经尝试了不同的convert_unicode/coerse_unicode型标志无济于事

任何帮助,将不胜感激

from sqlalchemy import Table, MetaData 
from sqlalchemy import create_engine 
from sqlalchemy.sql import select 


if __name__ == '__main__': 

    connection_string = 'oracle+cx_oracle://user:[email protected]:1521/orcl' 
    engine_args = { 
    'echo': False, 
    'convert_unicode': True, 
    'coerce_to_unicode': True 
    } 
    src_engine = create_engine(connection_string, **engine_args) 
    metadata = MetaData() 

    table = Table('POLICY_CONTRACT', metadata, autoload=True, autoload_with=src_engine, schema='TROPICS_POLICY') 
    s = select(table.columns) 
    q = src_engine.execute(s) 
    r = q.fetchone() 

    for k in r.keys(): 
    v = r[k] 
    if k == 'contract_content': 
     v1 = " ".join(["{0:02x}".format(ord(x)) for x in v]) 
     print("{0} : {1} : {2}\n".format(k, type(v), v[:100])) 

只是一个猜测,但你的Oracle 客户字符集可能是你的Windows安装程序之间的不同, Mac设置。当客户端字符集与数据需求不同时,可能会发生一些转换。从Globalization Support Guide

设置NLS_LANG正确地实现从客户端 操作系统字符编码为数据库字符集正确转换。 当这些设置相同时,Oracle数据库会假定发送或接收的数据被编码为与数据库字符集相同的字符集 ,因此可能无法执行字符集验证或转换 。如果转换需要 ,这可能会导致数据损坏。

在从一个字符集转换为另一个字符集期间,Oracle数据库 预计客户端数据将由NLS_LANG参数指定的字符集指定为 。如果将其他值放入字符串 (例如,通过使用CHR或CONVERT SQL函数),那么 值发送到数据库时可能会损坏,因为 它们未被正确转换。如果您已经正确配置了 环境,并且数据库字符集支持可能输入到 数据库的整个字符数据库,则不需要更改当前数据库 字符集的 。然而,如果你的企业变得更加全球化, 您有其他字符或新的语言支持,那么你 可能需要选择一个角色具有更大的字符集设置

您可以通过检查服务器设置检查:

select * from v$nls_parameters; 

检查NLS_CHARACTERSET

在Windows客户端,检查NLS_LANG进入注册表(或回声%NLS_LANG%,如果ENV variabl e被设定)。在Unix/Linux上,尝试echo $ NLS_LANG。不确定Mac,但也许Unix方法也可以。 (如果没有设置,我相信它默认为US7ASCII)

如果Mac与您的数据库服务器不同(我猜Mac是US7ASCII),那么先尝试导出不同的NLS_LANG,然后运行您的查询。例如

export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 

更多细节here

+0

感谢您指出我在正确的方向 我通过添加下面一行到我的Python脚本 os.putenv(“NLS_LANG”,“AMERICAN_AMERICA.WE8MSWIN1252排序的问题') – user3066737

+0

上面的设置对我来说不适用于python 3,因此我最终使用os.putenv('NLS_LANG','_.WE8ISO8859P1') 这就是LATIN1 – user3066737

+0

很高兴听到它的帮助,如果这解决了您的问题随时接受答案,谢谢 – tbone