Ошибка выполнения запроса в Oracle с расширенным символом ASCII (128-255)

У меня есть запрос, который нужно запустить для SQL, MYSQL, ORACLE, Postgres. Обычно у меня есть список записей, в которых я хочу получить запись, которая соответствует шаблону ввода при поиске.

Например

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

(Этот запрос - просто пример того, что я на самом деле пытаюсь выполнить).

Я использовал escape-символ '¤' (код ascii - 164), чтобы избежать подстановочного знака (символа подчеркивания), поэтому, например, если я буду искать 1, я бы заменил символ _ на ¤, чтобы он дал me книги, содержащие только имя 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.

Он отлично работает в версии Oracle 11G.

Также NLS_CHARACTERSET для 11G - WE8MSWIN1252, а для последней версии Oracle - AL32UTF8.

При выполнении запроса ниже дает мне длину 1.

SELECT LENGTH('¤') FROM BOOKS

Получим ли мы возможность включить поддержку расширенного кода ascii (код символа 128–255)) при установке оракула или мне нужно использовать какой-либо другой символ для экранирования подстановочного знака (_) Если да, то какой еще символ я могу использовать?


person himansu gupta    schedule 16.10.2020    source источник
comment
Не знаете, почему вам нужно использовать специальный символ - почему бы, например, не использовать обратную косую черту? Если вас беспокоит, что обратная косая черта может быть частью названия, которое вы ищете, а значение, которое вы ищете, - это данные (а не жестко закодированная постоянная строка), используйте специальный символ из нижнего диапазона ASCII - например, системный звонок символ, значение ASCII 7.   -  person mathguy    schedule 16.10.2020
comment
Похоже, вы неправильно вводите символ BEL. Как ты это делаешь? Я покажу в ОТВЕТЕ, как это сделать.   -  person mathguy    schedule 16.10.2020


Ответы (1)


Вот один из способов сделать это - использовать символ 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) для символа BEL не имеет этой проблемы.

person mathguy    schedule 16.10.2020