ORA-00911: 无效字符 00911. 00000 - Oracle 中出现“无效字符”异常错误
Posted
技术标签:
【中文标题】ORA-00911: 无效字符 00911. 00000 - Oracle 中出现“无效字符”异常错误【英文标题】:ORA-00911: invalid character 00911. 00000 - "invalid character" unusual Error in Oracle 【发布时间】:2020-12-24 11:49:27 【问题描述】:在 Oracle 中使用 CASE
语句执行以下查询时,我遇到了一些不寻常的错误。
查询
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
请提出问题所在
【问题讨论】:
你是如何以及在哪里执行它的?有时尾随分号会导致该错误(动态 SQL、JDBC ......)。否则,您确定这是第 4 行的内容吗?它周围还有什么? 我只是在SQL Worksheet
中执行,它给了我错误
Looking at the raw text 你的问题似乎有一些 Unicode 替换字符(efbfbd);也许您从某个地方复制并粘贴了该代码,并且在此过程中遇到了字符集转换问题或其他问题。如果你重新输入查询,它会抛出同样的错误吗?
并且 CASE
表达式缺少 WHEN
关键字,并且您不想使用 AS
为表达式设置别名。 db<>fiddle.... 但是没有ORA-00911: invalid character
错误。
@hud - 大概是您从中复制的任何内容,SQL Developer 使用不同的字符集。这并不是一个真正的 Oracle 或编码问题 *8-)
【参考方案1】:
最可能的原因(基于cmets中的交换,关于“复制和粘贴”):
您从某个地方(很可能是一个网站)复制了整个查询,其中单引号不是 ASCII 字符集中的标准撇号。相反,它们是书法名言。这特别适用于 IN 子句,其中您将字符串 BAT 括在单引号中。这就是为什么如果您在编辑器中重新输入查询就不会出现该问题的原因。
这个问题被以下事实掩盖了,如果您从 wherever 复制查询并将其粘贴到您的编辑器中,引号会在您的 GUI 中默默地转换为标准撇号(用于 显示 only) - 但不在实际的查询文本中。而且,问题最初可能是由于有人将有效查询(使用标准 ASCII 撇号)复制到网站上,网站默默地将这些单引号转换为书法引号。
让老大哥在不问我们甚至不告诉我们他在做什么的情况下为我们做事的众多“好处”之一......
而且,您为什么会收到该特定错误?因为解析器将查询中的每个“标记”解释为字符串或 SQL 关键字或标识符(表或列名)等。当它到达用书法引号括起来的 BAT 时,这不能是硬编码字符串,它不是 SQL 关键字,等等 - 所以解析器猜测它是一个标识符;但未用双引号括起来的标识符不能以书法左单引号开头。所以解析器告诉你“标识符”是无效的。
【讨论】:
以上是关于ORA-00911: 无效字符 00911. 00000 - Oracle 中出现“无效字符”异常错误的主要内容,如果未能解决你的问题,请参考以下文章