python-oracledb(新的 cx_Oracle)连接生成 NotSupportedError DPY-3012 错误

问题描述 投票:0回答:3

所以我正在尝试新的 oracledb python 库,它取代了 cx_oracle - 因为我不想安装 oracle 即时客户端。

un             = 'fred'
pwd            = 'mypass'
host           = 'server.mycompany.net'
port           =  1521
service_name   = 'servicea'


params = oracledb.ConnectParams(host=host, port=port, service_name=service_name)

with oracledb.connect(user=un, 
                      password=pwd,
                      params = params
                      ) as connection:
    
    with connection.cursor() as cursor:
        sql = "select * from dim_drug_product"
        for r in cursor.execute(sql):
            print(r)
 

我刚刚拿回来:

文件 C:\ProgramData\Anaconda3 nvs riel\lib\site-packages\oracledb rrors.py:103, 在 _raise_err(error_num, context_error_message, 原因, **args) 101 消息 = f"{消息} {context_error_message}” 102 exc_type = ERR_EXCEPTION_TYPES[error_num // 1000] --> 103 从原因中引发 exc_type(_Error(message))

NotSupportedError:DPY-3012:国家字符集 id 871 不是 python-oracledb 在瘦模式下支持

python oracle character-encoding cx-oracle python-oracledb
3个回答
2
投票

瘦驱动程序不支持国家字符集 871(UTF8,又名 CESU-8)。您必须 (a) 使用厚驱动程序,或者 (b) 切换到使用字符集 AL32UTF8(又名 UTF-8)。如果您想请求对较旧(非标准)字符集的支持,您可以在这里这样做:https://github.com/oracle/python-oracledb/issues

为了更全面地回答您在评论中的疑问:Oracle 的字符集名称与我们大多数人熟悉的标准化名称不同。由于 Oracle 很早就参与了 Unicode 的开发,因此存在一些令人困惑的名称!

  • Oracle名称UTF8对应标准名称CESU-8
  • Oracle 名称 AL32UTF8 对应标准名称 UTF-8

所以,UTF8 和 UTF-8 是不同的!


0
投票

您的数据库国家字符集是什么?

SELECT value AS db_ncharset
FROM nls_database_parameters
WHERE parameter = 'NLS_NCHAR_CHARACTERSET';

python-oracledb 1.0.0 中有关于“国家字符集”(又名 NCHAR)支持的记录限制:https://python-oracledb.readthedocs.io/en/latest/user_guide/globalization.html#character -集合和全球化

如果瘦模式不支持您的 NCHAR 字符集,请安装 Instant Client 并使用厚模式 - 或更新数据库以使用不同的 NCHAR 字符集,或使用 AL32UTF8 基本字符集并删除 NCHAR 的使用列。


0
投票

我向瘦驱动程序添加了对客户端编码的支持https://github.com/golubovai/python-oracledb-es。测试用例补充了包含西里尔字符的数据,并成功通过数据库(cp1251)。

© www.soinside.com 2019 - 2024. All rights reserved.