CHR(0) è il carattere utilizzato per terminare una stringa nel linguaggio di programmazione C (tra gli altri).
Quando superi CHR(0) alla funzione, a sua volta, lo passerà alla funzione di livello inferiore che analizzerà le stringhe che hai passato e costruirà un modello di espressione regolare da quella stringa. Questo modello di espressione regolare vedrà CHR(0) e pensa che sia il terminatore di stringa e ignora il resto del modello.
Il comportamento è più facile da vedere con REGEXP_REPLACE :
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
Cosa succede quando esegui questo:
CHR(0)viene compilato in un'espressione regolare e diventa un terminatore di stringa.- Ora il modello è solo il terminatore di stringa e quindi il modello è una stringa di lunghezza zero.
- L'espressione regolare viene quindi confrontata con la stringa di input e legge il primo carattere
ae trova che una stringa di lunghezza zero può essere trovata prima diaquindi sostituisce il nulla che ha trovato prima diacon unddando l'outputda. - Si ripeterà quindi per il carattere successivo trasformando
badb. - e così via fino a raggiungere la fine della stringa quando corrisponderà al modello di lunghezza zero e aggiungere un
dfinale .
E otterrai l'output:
dadbdcd_ded
(dove _ è il CHR(0) carattere. )
Nota:il CHR(0) nell'input non viene sostituito.
Se anche il programma client che stai utilizzando tronca la stringa in CHR(0) potresti non vedere l'intero output (questo è un problema con il modo in cui il tuo client rappresenta la stringa e non con l'output di Oracle) ma può anche essere mostrato usando DUMP() :
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Uscite:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] Allora cosa sta succedendo con
REGEXP_LIKE( '1234567890', CHR(0) )
Creerà un modello di espressione regolare di stringa di lunghezza zero e cercherà una corrispondenza di lunghezza zero prima di 1 carattere - che troverà e poi restituirà che ha trovato una corrispondenza.