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
ae encontra uma string de comprimento zero que pode ser correspondida antes doaentão ele substitui o nada que correspondeu antes doacom umddando a saídada. - Ele será repetido para o próximo caractere transformando
bparadb. - e assim por diante até chegar ao final da string, quando ela corresponderá ao padrão de comprimento zero e anexará um
dfinal .
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.