所以我正在尝试新的 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 在瘦模式下支持
瘦驱动程序不支持国家字符集 871(UTF8,又名 CESU-8)。您必须 (a) 使用厚驱动程序,或者 (b) 切换到使用字符集 AL32UTF8(又名 UTF-8)。如果您想请求对较旧(非标准)字符集的支持,您可以在这里这样做:https://github.com/oracle/python-oracledb/issues。
为了更全面地回答您在评论中的疑问:Oracle 的字符集名称与我们大多数人熟悉的标准化名称不同。由于 Oracle 很早就参与了 Unicode 的开发,因此存在一些令人困惑的名称!
所以,UTF8 和 UTF-8 是不同的!
您的数据库国家字符集是什么?
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 的使用列。
我向瘦驱动程序添加了对客户端编码的支持https://github.com/golubovai/python-oracledb-es。测试用例补充了包含西里尔字符的数据,并成功通过数据库(cp1251)。