ORA-00911:字符00911无效,00000 -Oracle中的“无效字符”异常错误

ryhaxcpt  于 2023-04-29  发布在  Oracle
关注(0)|答案(2)|浏览(213)

当使用CASE语句在Oracle中执行下面的查询行时,我得到了一些不寻常的错误。

查询

SELECT MODEL_NAME, 
       CASE WHEN EQP_TYPE_NAME IN('BAT') THEN MODEL_NAME  END AS EQUIPMENT_MODEL_NAME 
FROM  solar_equipment;

错误在下面

ORA-00911: invalid character
00911. 00000 -  "invalid character"
*Cause:    identifiers may not start with any ASCII character other than
           letters and numbers.  $#_ are also allowed after the first
           character.  Identifiers enclosed by doublequotes may contain
           any character other than a doublequote.  Alternative quotes
           (q'#...#') cannot use spaces, tabs, or carriage returns as
           delimiters.  For all other contexts, consult the SQL Language
           Reference Manual.
*Action:
Error at Line: 4 Column: 1

请提出什么是错的

jum4pzuy

jum4pzuy1#

最可能的原因(基于评论中关于“复制和粘贴”的交流):
您从某个地方复制了整个查询-很可能是网站-其中单引号不是ASCII字符集的标准撇号。相反,它们是书法语录。这特别适用于IN子句,其中字符串BAT用单引号括起来。这就是为什么如果你在编辑器中重新输入查询,你不会遇到这个问题。
这个问题被这样一个事实所掩盖,如果你从 wherever 复制查询并将其粘贴到编辑器中,引号会在GUI中被无声地翻译成标准的撇号(仅用于 * 显示 *)-但不会在实际的查询文本中。而且,这个问题最初可能是因为有人将一个有效的查询(带有标准ASCII撇号)复制到网站,网站会悄悄地将这些单引号转换成书法引号。
让老大哥为我们做事而不问我们,甚至不告诉我们他在做什么,这是许多“好处”之一。..
为什么会出现这样的错误?因为解析器将查询中的每个“标记”解释为字符串、SQL关键字或标识符(表名或列名)等。当它到达用书法引号括起来的BAT时,它不能是硬编码的字符串,也不是SQL关键字等。- 所以解析器猜测它是标识符;但没有用双引号括起来的标识符不能以书法左单引号开始。所以解析器会告诉您“标识符”是无效的。

bttbmeg0

bttbmeg02#

由于一些奇怪的原因,当您将通过Microsoft Teams聊天发送的Oracle DDL粘贴到SQL Developer时,总是会发生此错误。
似乎一些隐藏的无效字符被添加到代码中,解决这个问题的唯一方法是手动重新输入所有内容(不推荐)或通过电子邮件或其他渠道获取。
想一想类似的情况,Microsoft Word自动将您的直引号字符更改为排版引号,后者在SQL中是非法的。

SELECT *
FROM "TABLE_X"

转换为:

SELECT *
FROM “TABLE_X”

相关问题