CHR(0) in REGEXP_LIKE

前端 未结 3 751
被撕碎了的回忆
被撕碎了的回忆 2021-01-15 08:25

I am using the queries to check how chr(0) behaves in regexp_like.

CREATE TABLE t1(a char(10));
INSERT INTO t1 VALUES(\'0123456789\');
SELECT CASE WHEN REGE         


        
3条回答
  •  無奈伤痛
    2021-01-15 09:18

    Not an answer, just some experiments, but too long for a comment.

    REGEXP_COUNT seems to be confused by chr(0), counting every character as chr(0); besides, it seems to find one occurrence more than the size of the string.

    SQL> select dump('a'), regexp_count('a', chr(0)) from dual;
    
    DUMP('A')        REGEXP_COUNT('A',CHR(0))
    ---------------- ------------------------
    Typ=96 Len=1: 97                        2
    
    SQL> select dump(chr(0)), regexp_count(chr(0), chr(0)) from dual;
    
    DUMP(CHR(0))   REGEXP_COUNT(CHR(0),CHR(0))
    -------------- ---------------------------
    Typ=1 Len=1: 0                           2
    
    SQL> select dump('0123456789' || chr(0)), regexp_count('0123456789' || chr(0), chr(0)) from dual;
    
    DUMP('0123456789'||CHR(0))                    REGEXP_COUNT('0123456789'||CHR(0),CHR(0))
    --------------------------------------------- -----------------------------------------
    Typ=1 Len=11: 48,49,50,51,52,53,54,55,56,57,0                                        12
    

    LIKE seems to have a good behaviour, while its REGEXP version seems to fail:

    SQL> select 1 from dual where 'a' like '%' || chr(0) || '%';
    
    no rows selected
    
    SQL> select 1 from dual where regexp_like ('a', chr(0));
    
             1
    ----------
             1
    

    Same thing for INSTR and REGEXP_INSTR

    SQL> select 1 from dual where instr('a', chr(0)) != 0;
    
    no rows selected
    
    SQL> select 1 from dual where regexp_instr('a', chr(0)) != 0;
    
             1
    ----------
             1
    

    Tested on 11g XE Release 11.2.0.2.0 - 64bit

提交回复
热议问题