【问题标题】:regexp_replace maybe collation issueregexp_replace 可能是排序规则问题
【发布时间】:2021-10-04 21:24:34
【问题描述】:

我的 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

【问题讨论】:

    标签: sql oracle regexp-replace


    【解决方案1】:

    据我了解,你不应该参与其中

    这取决于 nls_session_parameters。有两个参数

    SELECT * FROM nls_session_parameters WHERE parameter IN ('NLS_COMP', 'NLS_SORT');
    

    NLS_COMP - 如何比较字符(ANSI、BINARY、LINGUISTIC)

    NLS_SORT - 字符顺序(BINARY,例如 GERMAN、GERMAN_CI、GERMAN_AI) (_CI - 表示不区分大小写,_AI - 不区分重音)

    因为在您的会话中 NLS_SORT 设置为 GERMAN ü 介于 a-z 之间。

      alter session set NLS_SORT=BINARY - and regexp will remove Umlauts. 
    

    【讨论】:

    • 啊,因为我的 nls_comp 是二进制的,所以我得到的结果是 if 'ü' > 'z' then... 1. 谢谢!
    • 还有一个问题:我想我可以用 select regexp_replace('ABcdäü~~~--- Ø asdsad 123 /() ´´´', '[^a- zA-Z0-9]', '') x from dual x order by x desc COLLATE BINARY ;但是,这不会执行。可以查吗?
    • 您应该为会话设置此 nls_sort。但是如果想用普通字符替换重音字符,我们可以将其转换为 ACSCI。 select CONVERT('ABcdäü~~~--- Ø asdsad 123 /() ´´´', 'US7ASCII') from dual;
    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2011-11-04
    • 2011-05-18
    相关资源
    最近更新 更多