CHR(0)
é o caractere usado para encerrar uma string na linguagem de programação C (entre outros). Quando você passa
CHR(0)
para a função, ele, por sua vez, passará para a função de nível inferior que analisará as strings que você passou e criará um padrão de expressão regular a partir dessa string. Este padrão de expressão regular verá CHR(0)
e acho que é o terminador de string e ignore o resto do padrão. O comportamento é mais fácil de ver com
REGEXP_REPLACE
:SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
O que acontece quando você executa isso:
CHR(0)
é compilado em uma expressão regular e se torna um terminador de string.- Agora, o padrão é apenas o terminador de string e, portanto, o padrão é uma string de comprimento zero.
- A expressão regular é então comparada com a string de entrada e lê o primeiro caractere
a
e encontra uma string de comprimento zero que pode ser correspondida antes doa
então ele substitui o nada que correspondeu antes doa
com umd
dando a saídada
. - Ele será repetido para o próximo caractere transformando
b
paradb
. - e assim por diante até chegar ao final da string, quando ela corresponderá ao padrão de comprimento zero e anexará um
d
final .
E você obterá a saída:
dadbdcd_ded
(onde _ é o
CHR(0)
personagem. ) Nota:o
CHR(0)
na entrada não é substituído. Se o programa cliente que você está usando também está truncando a string em
CHR(0)
você pode não ver a saída inteira (este é um problema com a forma como seu cliente está representando a string e não com a saída do Oracle), mas também pode ser mostrado usando DUMP()
:SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Saídas:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] Então o que está acontecendo com
REGEXP_LIKE( '1234567890', CHR(0) )
Ele criará um padrão de expressão regular de string de comprimento zero e procurará uma correspondência de comprimento zero antes do
1
caractere - que ele encontrará e retornará que encontrou uma correspondência.