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
a
e trova che una stringa di lunghezza zero può essere trovata prima dia
quindi sostituisce il nulla che ha trovato prima dia
con und
dando l'outputda
. - Si ripeterà quindi per il carattere successivo trasformando
b
adb
. - e così via fino a raggiungere la fine della stringa quando corrisponderà al modello di lunghezza zero e aggiungere un
d
finale .
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.