regexp_replace 可能是整理问题
regexp_replace maybe collation issue
我的 regexp_replace 没有按预期删除变音符号。我认为这是因为整理,但我的测试确实显示不同。据我了解,你不应该是 a-zA-Z0-9 的一部分。显然是这样:
select SYS_CONTEXT('USERENV','NLS_SORT') from dual;
select decode('ü','u',0,1) from dual;
select regexp_replace('ABcdäü~~~--- Ø asdsad 123 /() ´´´', '[^a-zA-Z0-9]', '') x from dual;
begin
if 'ü' > 'z' then
dbms_output.PUT_LINE(1);
else
dbms_output.PUT_LINE(0);
end if;
if 'ü' > 'Z' then
dbms_output.PUT_LINE(1);
else
dbms_output.PUT_LINE(0);
end if;
if 'ü' > '9' then
dbms_output.PUT_LINE(1);
else
dbms_output.PUT_LINE(0);
end if;
end;
结果:
German
1
ABcdäüØasdsad123
1
1
1
So as far as I understand it ü should not be part
这取决于 nls_session_parameters。有两个参数
SELECT * FROM nls_session_parameters WHERE parameter IN ('NLS_COMP', 'NLS_SORT');
NLS_COMP - 如何比较字符 (ANSI,BINARY,LINGUISTIC)
NLS_SORT - 字符顺序(二进制,例如德语、GERMAN_CI、GERMAN_AI)
(_CI - 表示不区分大小写,_AI - 不区分重音)
因为在您的会话中 NLS_SORT 设置为德语 ü 介于 a-z 之间。
alter session set NLS_SORT=BINARY - and regexp will remove Umlauts.
我的 regexp_replace 没有按预期删除变音符号。我认为这是因为整理,但我的测试确实显示不同。据我了解,你不应该是 a-zA-Z0-9 的一部分。显然是这样:
select SYS_CONTEXT('USERENV','NLS_SORT') from dual;
select decode('ü','u',0,1) from dual;
select regexp_replace('ABcdäü~~~--- Ø asdsad 123 /() ´´´', '[^a-zA-Z0-9]', '') x from dual;
begin
if 'ü' > 'z' then
dbms_output.PUT_LINE(1);
else
dbms_output.PUT_LINE(0);
end if;
if 'ü' > 'Z' then
dbms_output.PUT_LINE(1);
else
dbms_output.PUT_LINE(0);
end if;
if 'ü' > '9' then
dbms_output.PUT_LINE(1);
else
dbms_output.PUT_LINE(0);
end if;
end;
结果:
German
1
ABcdäüØasdsad123
1
1
1
So as far as I understand it ü should not be part
这取决于 nls_session_parameters。有两个参数
SELECT * FROM nls_session_parameters WHERE parameter IN ('NLS_COMP', 'NLS_SORT');
NLS_COMP - 如何比较字符 (ANSI,BINARY,LINGUISTIC)
NLS_SORT - 字符顺序(二进制,例如德语、GERMAN_CI、GERMAN_AI) (_CI - 表示不区分大小写,_AI - 不区分重音)
因为在您的会话中 NLS_SORT 设置为德语 ü 介于 a-z 之间。
alter session set NLS_SORT=BINARY - and regexp will remove Umlauts.