Oracle REGEXP_LIKE игнорирует ЧУВСТВИТЕЛЬНОСТЬ К РЕГИСТРУ

Мы пытаемся выполнить следующий запрос в Oracle Database 19.3, и результат всегда такой, как если бы чувствительность к регистру была проигнорирована.

select 1 from dual where regexp_like('CHIEN', '[a-z]+', 'c');

И результат запроса

1

Даже с:

ALTER SESSION SET NLS_COMP=ANSI;
ALTER SESSION SET NLS_SORT=GERMAN_AI;

Мы думаем, что это происходит из-за параметра NLS, но мы не нашли, какой именно.

У нас есть такие параметры:

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_calendar                         string      GREGORIAN
nls_comp                             string      BINARY
nls_currency                         string      €
nls_date_format                      string      DD/MM/RR
nls_date_language                    string      FRENCH
nls_dual_currency                    string      €
nls_iso_currency                     string      FRANCE
nls_language                         string      FRENCH
nls_length_semantics                 string      BYTE
nls_nchar_conv_excp                  string      FALSE
nls_numeric_characters               string      ,

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_sort                             string      FRENCH
nls_territory                        string      FRANCE
nls_time_format                      string      HH24:MI:SSXFF
nls_timestamp_format                 string      DD/MM/RR HH24:MI:SSXFF
nls_timestamp_tz_format              string      DD/MM/RR HH24:MI:SSXFF TZR
nls_time_tz_format                   string      HH24:MI:SSXFF TZR

И наш NLS_LANG установлен на French_France.AL32UTF8.


person Chris    schedule 08.06.2021    source источник
comment
Третий параметр применяет чувствительность к регистру или нечувствительность к регистру. Если вы ставите C, это чувствительно, вы должны поставить «i»   -  person Vahram Danielyan    schedule 08.06.2021
comment
Но мне нужна чувствительность к регистру.   -  person Chris    schedule 08.06.2021
comment
Да, измените настройки сортировки/композиции NLS с нечувствительных к регистру на чувствительные к регистру, и это должно решить проблему.   -  person MT0    schedule 08.06.2021
comment
это не решает проблему. С regexp_count все в порядке, но не с regexp_like   -  person Chris    schedule 08.06.2021
comment
Возможно, этот пост stackoverflow.com/questions/57986830/ поможет вам.   -  person Kapitany    schedule 08.06.2021


Ответы (1)


Наконец я нашел решение.

Проблема была с NLS_SORT=FRENCH (или любой лингвистической сортировкой)

NLS_SORT=FRENCH =› AaBbCcDdEeFfGgHhIiJjKkLlMmNn .... Z

И когда мы ищем регулярное выражение [a-z], мы включаем BCDE ... Z

Решение состоит в том, чтобы установить NLS_SORT=BINARY

В моем случае я установил переменную среды NLS_SORT=BINARY. Без этого Oracle использует значение NLS_SORT по умолчанию, соответствующее NLS_LANG.

person Chris    schedule 09.06.2021