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
相关产品推荐
相关产品推荐

