Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sqlalchemy CLOB在windows和Mac上返回不同的结果_Python_Oracle_Sqlalchemy - Fatal编程技术网

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

Python Sqlalchemy CLOB在windows和Mac上返回不同的结果,python,oracle,sqlalchemy,Python,Oracle,Sqlalchemy,给定以下代码 windows上的输出有完整的8位字节,而Mac上的字符串被编码为7位ASCII码,编码方式类似于“替换” MAC 25 50 44 46 2d 31 2e 33 0a 2543 69 3f0a 35 20 30 20 6f 62 6a 0a 3c 3c 2f 窗口 25 50 44 46 2d 31 2e 33 0a 25c7 ec 8f a20a 35 20 20 6f 62 6a 0a 3c 3c 2f 我安装了相同版本的sqlalchemy、python、cx oracle

给定以下代码 windows上的输出有完整的8位字节,而Mac上的字符串被编码为7位ASCII码,编码方式类似于“替换”

MAC 25 50 44 46 2d 31 2e 33 0a 2543 69 3f0a 35 20 30 20 6f 62 6a 0a 3c 3c 2f

窗口 25 50 44 46 2d 31 2e 33 0a 25c7 ec 8f a20a 35 20 20 6f 62 6a 0a 3c 3c 2f

我安装了相同版本的sqlalchemy、python、cx oracle和instant client

我尝试了不同的convert\u unicode/coerse\u 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:pw@db: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设置之间可能有所不同。当客户端字符集不同于数据要求时,可能会发生一些转换。从:

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

在从一个字符集转换到另一个字符集的过程中,Oracle数据库 期望客户端数据以指定的字符集进行编码 通过NLS_LANG参数。如果将其他值放入字符串中 (例如,通过使用CHR或CONVERT SQL函数),然后 值在发送到数据库时可能会损坏,因为 它们没有正确转换。如果已配置 如果数据库字符集支持 可输入到数据库中的字符数据的整个集合 数据库,则不需要更改当前数据库 字符集。但是,如果您的企业变得更加全球化 如果要支持其他字符或新语言,则 可能需要选择具有更大字符集的字符集

您可以通过检查以下内容来检查服务器设置:

select * from v$nls_parameters;
检查NLS\U字符集

在Windows客户端上,检查注册表中的NLS_LANG条目(如果设置了env变量,则返回%NLS_LANG%)。在Unix/Linux上,尝试echo$NLS_LANG。不确定Mac,但也许Unix方法也可以。(如果未设置,我相信它默认为US7ASCII)

如果Mac与db服务器不同(我猜Mac是US7ASCII),那么请尝试先导出不同的NLS_语言,然后运行查询。比如说

export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

更多详细信息

只是猜测,但是您的Oracle客户端字符集在Windows设置和Mac设置之间可能有所不同。当客户端字符集不同于数据要求时,可能会发生一些转换。从:

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

在从一个字符集转换到另一个字符集的过程中,Oracle数据库 期望客户端数据以指定的字符集进行编码 通过NLS_LANG参数。如果将其他值放入字符串中 (例如,通过使用CHR或CONVERT SQL函数),然后 值在发送到数据库时可能会损坏,因为 它们没有正确转换。如果已配置 如果数据库字符集支持 可输入到数据库中的字符数据的整个集合 数据库,则不需要更改当前数据库 字符集。但是,如果您的企业变得更加全球化 如果要支持其他字符或新语言,则 可能需要选择具有更大字符集的字符集

您可以通过检查以下内容来检查服务器设置:

select * from v$nls_parameters;
检查NLS\U字符集

在Windows客户端上,检查注册表中的NLS_LANG条目(如果设置了env变量,则返回%NLS_LANG%)。在Unix/Linux上,尝试echo$NLS_LANG。不确定Mac,但也许Unix方法也可以。(如果未设置,我相信它默认为US7ASCII)

如果Mac与db服务器不同(我猜Mac是US7ASCII),那么请尝试先导出不同的NLS_语言,然后运行查询。比如说

export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

更多详细信息

感谢您为我指明了正确的方向,我通过在python脚本os.putenv('NLS_LANG','AMERICAN_AMERICA.WE8MSWIN1252')中添加以下行对问题进行了排序上述设置不适用于我的python 3,因此我最终使用了os.putenv('NLS_LANG','UU8ISO8859P1'),很高兴听到它的帮助,如果这解决了您的问题,请随意接受答案,感谢Hanks为我指明了正确的方向。我通过在python脚本os.putenv('NLS_LANG','AMERICAN_AMERICA.WE8MSWIN1252')中添加以下行对问题进行了排序。上述设置不适用于python 3,因此我最终使用了os.putenv('NLS_LANG','U8ISO8859P1'))听到它有帮助真是太好了,如果这解决了你的问题,请随意接受答案,谢谢