Oracle 将 "'SParis2" 的文本解析为字符串文字,然后找到 S 将其视为无法识别的 SQL 转义序列

Posted

技术标签:

【中文标题】Oracle 将 "\'SParis2" 的文本解析为字符串文字,然后找到 S 将其视为无法识别的 SQL 转义序列【英文标题】:Oracle parses text of "'SParis2" as a string literal then finds S which it is treating as a SQL Escape Sequence which it doesn't recognizeOracle 将 "'SParis2" 的文本解析为字符串文字,然后找到 S 将其视为无法识别的 SQL 转义序列 【发布时间】:2012-10-17 12:26:57 【问题描述】:

运行 jsp 报告后出现以下错误。

查询标签:doAfterBody(),0,不支持 SQL92 令牌在位置:3477:S

我知道以下 sn-p 导致了问题“S”:

…….. AND (L.Applicable_Location_Region_ID IN (N'PARIS2', N'SParis2'))

根据我的调查,我了解到以下情况: Oracle 解析 SQL 并将 "'SParis2" 的文本视为字符串文字,然后找到 S 并将其视为它无法识别的 SQL 转义序列。

以下链接很好地解释了“转义字符”: http://docs.oracle.com/cd/F49540_01/DOC/inter.815/a67843/cqspcl.htm

我们必须使用 S 后跟名称。

上面的 AND 语句在 SQL Server 和 mysql 中运行良好,但在 Oracle 中会出现问题,因为“当您使用大括号转义单个字符时,转义的字符将成为查询中的单独标记。”

由于上述原因,应用程序将 S 视为转义的带大括号的单个字符成为查询中的单独标记。

所以请你帮我如何在 oracle 中用大括号转义单个字符或任何建议。

【问题讨论】:

您是否正在构建整个 SQL 字符串包括数据?您应该改用带参数的准备好的语句。除了(可能)解决这个问题之外,它还将保护您免受大多数SQL injection attacks 的侵害。 【参考方案1】:

试试

AND (L.Applicable_Location_Region_ID IN (N'PARIS2', N'\S\Paris2')) 

编辑:

从 Toad 运行此查询

select (N'Stest2') from dual where ((N'Stest2') IN (N'test2', N'Stest2'))

对我有用。 您确定问题出在 Oracle 数据库中,而不是在访问它的类/驱动程序中吗?

【讨论】:

感谢您的建议,但仍然收到 java.sql.SQLException: Non supported SQL92 token at position: 3546: S 顺便说一句,你的错误出现在 char 3477 上,插入反斜杠后它跳转到 3546 ?

以上是关于Oracle 将 "'SParis2" 的文本解析为字符串文字,然后找到 S 将其视为无法识别的 SQL 转义序列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库的安装与卸载

将.csv格式的文件导入oracle数据库中

spring+ibatis 调用Oracle存储过程出错

Oracle中的单引号怎么转义

VBA 如何将数字转换为中文大写

Oracle- 为啥在组合列中显示此错误“ORA-00904: "OUTLET_STATUS": invalid identifier"?