CHR(0)
är tecknet som används för att avsluta en sträng i programmeringsspråket C (bland annat).
När du skickar CHR(0)
till funktionen kommer den i sin tur att skicka den till en funktion på lägre nivå som kommer att analysera strängarna du har skickat in och bygga ett reguljärt uttrycksmönster från den strängen. Detta reguljära uttrycksmönster kommer att se CHR(0)
och tror att det är strängterminatorn och ignorera resten av mönstret.
Beteendet är lättare att se med REGEXP_REPLACE
:
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
Vad händer när du kör detta:
CHR(0)
kompileras till ett reguljärt uttryck och blir en strängterminator.- Nu är mönstret bara strängavslutningen och därför är mönstret en nolllängd sträng.
- Det reguljära uttrycket matchas sedan mot inmatningssträngen och det läser det första tecknet
a
och hittar en noll-längd sträng kan matchas förea
så det ersätter ingenting det har matchat förea
med end
ger utdatada
. - Det kommer sedan att upprepas för nästa tecken som transformerar
b
tilldb
. - och så vidare tills du når slutet av strängen då den matchar nolllängdsmönstret och lägger till en sista
d
.
Och du kommer att få utdata:
dadbdcd_ded
(där _ är CHR(0)
karaktär. )
Obs:CHR(0)
ingången ersätts inte.
Om klientprogrammet du använder också trunkerar strängen vid CHR(0)
du kanske inte ser hela utdata (detta är ett problem med hur din klient representerar strängen och inte med Oracles utdata) men det kan också visas med DUMP()
:
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Utgångar:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] Så vad händer med
REGEXP_LIKE( '1234567890', CHR(0) )
Det kommer att skapa ett reguljärt uttrycksmönster för strängar med noll längd och det kommer att leta efter en matchning med noll längd före 1
tecken - som den kommer att hitta och sedan returnera att den har hittat en matchning.