ORA-00911: invalid character 错误解决集锦
ORA-00911: invalid character 错误解决集锦
案例一:字符集的问题
网上搜了一遍, 大多数是因为分号( ; ) 的问题. 而我的sql文件是没有分号的, 最后发现是sql文件编码和服务器字符集的差异造成
sql文件怎么都看不出问题,直到在UltraEdit里切换到16进制模式下才发现有些怪字符, 文件编码是UTF-8
然而服务器的字符集是TH8TISASCII
select userenv('language') from dual
解决办法: 把sql文件另存为ASCII编码就行了.
案例二:今天在访问远程oralce数据库时,以前正确的语句也都会出现“ORA-00911: invalid character”的错误信息,在网上找了很长时间,也没有找到原因,但在搜索时,看到一篇文章说字符集的问题,我突然想到,我的系统之前恢复过系统,oarcle客户端也是今天刚安装的,我记得在系统设置中,要设置字符集那个变量,于是我从服务器上看到了该字段,在我本机上果然没有,于是我按照上面的路径把那个变量加上,具体路径和变量名如下:
控制面板--系统和安全---系统--高级系统设置--高级--环境变量--系统变量中
变量名:NLS_LANG
变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
把这个变量添加完成以后,把系统重启一下就ok了,重启以后,错误提示消失了。
这个变量是在读取数据库中中文名称时出现的。
案例三:今天在写SQL查询Oracle中的数据时遇到一个问题。在一般的SQL查询分析器中写好的SQL语句(运行一切正常),扔到用C#写的程序中就报错。错误代码如下:
System.Data.OleDb.OleDbException:One or more errors occurred during processing of command.
ORA-00911: invalid character at...
检查了半天,实在是没找到任何SQL错误的原因,(本来怀疑是字符转码的问题,后来给排除了);最后,终于在网上查到了答案,原来“都是分号惹的祸”!
我一般写SQL的时候都喜欢在每个语句结尾加上":",我想这也是一般写SQL的程序员的习惯。因为很多SQL的查询分析其时都会将这个分号当成一个语句的结束。但是,其实在正式执行的时候,是不能将这个分号扔到Oracle的解析器中的,因为Oracle的语法解析器特别严格,就会报出以上的错误出来,解决方法也很简单,去掉分号就可以了。
以上的问题适用于任何用程序书写的Oracle数据查询,看起来有时候习惯也会害死人的。
注:
我是用C语言的OCI接口调用sql语句,sql语句末尾加了分号。
错误号: 911
错误描述:ORA-00911: invalid character