You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用cx_Oracle执行SQL报ORA-00911无效字符如何解决

cx_Oracle 执行SQL报ORA-00911: invalid character 解决方案

问题现象

同一条INSERT语句,在数据库可视化编辑器中手动执行正常,通过Python的cx_Oracle库调用cursor.executemany()执行时报无效字符错误,相关代码与报错如下:
业务代码片段:

print(finalSql)
print(data)
cursor.executemany(finalSql, data)

执行输出与报错:

insert into TEST_MAN (MANUFACTURER,REGISTRY_ID,MFR_DESCRIPTION,STATUS,PARTY_TYPE,CITY,STATE,POSTAL_CODE,PRIMARY_PHONE_NUMBER,PRIMARY_PHONE_EXTENSION,WEBSITE,CONTACT_NAME,GENERAL_INQUIRY_EMAIL,MANUFACTURER_NAME_LONG,MANUFACTURER_ADDRESS,COUNTRY,ADDRESS1,SUPPLIER_NAME,SUPPLIER_EMAIL,SUPPLIER_PHONE_NUMBER,ADDRESS2) values (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21)
[('gxsx-01', '2009', 'gxsx-01 test', 'Active', 'Organization', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '')]
Traceback (most recent call last):
  File "/home/dev/main.py", line 53, in <module>
    cursor.executemany(finalSql, data)
cx_Oracle.DatabaseError: ORA-00911: invalid character

根因说明

最常见触发原因:SQL语句末尾携带了分号;
数据库可视化编辑器默认会把分号识别为多条SQL的分隔符,执行前自动过滤单条语句末尾的分号,所以手动运行不会报错;但cx_Oracle驱动不会做这类自动兼容处理,会把分号作为SQL内容的一部分传给Oracle解析器,直接触发非法字符报错。
如果确认SQL末尾没有分号,大概率是SQL中混入了肉眼不可见的特殊字符:比如从网页、文档复制SQL时带的零宽空格、全角空格、中文标点,这类字符普通打印不会显示,但会被Oracle识别为非法内容。

修复步骤

  • 检查finalSql的生成逻辑,删除传给cx_Oracle执行的SQL语句末尾的分号,单条SQL执行场景不需要加分号结尾。
  • 如果删完分号仍报错,把打印出的finalSql复制到支持显示所有隐藏字符的纯文本编辑器中,排查并删除零宽空格、全角符号这类异常隐形字符。
  • 现有代码里的绑定变量写法:1-:21、executemany传入的参数元组格式都是符合cx_Oracle语法要求的,这部分不需要调整。

内容的提问来源于stack exchange,提问作者Denver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:39:16