问题描述
我们正在 Oracle 数据库 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
解决方法
我终于找到了解决方案。
问题在于 NLS_SORT=FRENCH(或任何语言排序)
NLS_SORT=FRENCH => AaBbCcDdEeFfGgHhIiJjKkLlMmNn .... Z
当我们查找正则表达式 [a-z] 时,我们包括 BCDE ... Z
解决办法是设置NLS_SORT=BINARY
就我而言,我设置了环境变量 NLS_SORT=BINARY。否则,Oracle 将采用与 NLS_LANG 对应的默认 NLS_SORT 值。