在Oracle中使用扩展ASCII字符运行查询时出错128-255

问题描述

我有一个需要针对sqlMysqL,ORACLE,Postgres运行的查询。基本上,我有一个记录列表,希望在搜索获取与输入模式匹配的记录。

例如

SELECT * FROM BOOKS WHERE NAME LIKE '%TEST¤_1%' ESCAPE '¤'
@H_404_7@

(此查询只是我实际尝试运行的示例)。

我已经使用转义符“¤”(ASCII代码-164)来转义通配符(下划线字符),因此例如,如果我搜索 1,我会将_字符替换为¤它会给我只包含名称1的书,而不给我包含1之前的任何字符的书。

对于MysqL,postgres和sql来说运行正常,但是在oracle中,当我运行上述查询时,它将在最新版本的oracle上引发以下错误

ORA-01425: escape character must be character string of length 1
01425. 00000 -  "escape character must be character string of length 1"
*Cause:    Given escape character for LIKE is not a character string of
       length 1.
*Action:   Change it to a character string of length 1.
@H_404_7@

在11G版本的oracle中工作正常。

11G的NLS_CHaraCTERSET也为WE8MSWIN1252,而最新的oracle版本为AL32UTF8。

在以下查询条件下运行时,我的长度为1。

SELECT LENGTH('¤') FROM BOOKS
@H_404_7@

在安装oracle时,是否可以选择启用对扩展的ascii代码(字符代码128-255)的支持,还是我需要使用其他任何字符来转义通配符(_)?如果是,其他字符可以我用吗?

解决方法

这里是执行此操作的一种方法-使用BEL字符,其ASCII值为7。

with
  sample_data (name) as (
    select 'TWITTER'  from dual union all
    select 'MY_PHONE' from dual union all
    select 'MYOHMY'   from dual
  )
select name
from   sample_data
where  name like 'MY' || chr(7) || '_%' escape chr(7)
;

NAME
---------
MY_PHONE

注意使用CHR()函数输入特殊字符。如果您使用其他机制(例如,键盘组合,使用各种特殊键),则无法完全控制; chr(7)的{​​{1}}没问题。