CHR(0)
is het teken dat wordt gebruikt om een string te beëindigen in de programmeertaal C (onder andere).
Wanneer u door CHR(0)
komt aan de functie zal het het op zijn beurt doorgeven aan een functie op een lager niveau die de strings die je hebt doorgegeven zal ontleden en een regulier expressiepatroon van die string zal bouwen. Dit reguliere expressiepatroon ziet CHR(0)
en denk dat het de stringterminator is en negeer de rest van het patroon.
Het gedrag is gemakkelijker te zien met REGEXP_REPLACE
:
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
Wat gebeurt er als je dit uitvoert:
CHR(0)
wordt gecompileerd tot een reguliere expressie en wordt een string-terminator.- Het patroon is nu slechts de tekenreeksterminator en dus is het patroon een tekenreeks met een lengte van nul.
- De reguliere expressie wordt dan vergeleken met de invoerreeks en leest het eerste teken
a
en vindt dat een tekenreeks met lengte nul kan worden vergeleken vóór dea
dus het vervangt het niets waarmee het overeenkwam vóór dea
met eend
het geven van de outputda
. - Het wordt dan herhaald voor het volgende teken dat
b
transformeert naardb
. - enzovoort totdat je het einde van de tekenreeks bereikt, wanneer het overeenkomt met het patroon met lengte nul en een laatste
d
toevoegt .
En je krijgt de output:
dadbdcd_ded
(waarbij _ de CHR(0)
is karakter. )
Let op:de CHR(0)
in de invoer wordt niet vervangen.
Als het clientprogramma dat u gebruikt ook de tekenreeks afkapt bij CHR(0)
u ziet mogelijk niet de volledige uitvoer (dit is een probleem met de manier waarop uw client de string vertegenwoordigt en niet met de uitvoer van Oracle), maar het kan ook worden weergegeven met DUMP()
:
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Uitgangen:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] Dus wat gebeurt er met
REGEXP_LIKE( '1234567890', CHR(0) )
Het maakt een regulier expressiepatroon met een tekenreeks van nul lengte en zoekt naar een overeenkomst met een lengte van nul vóór de 1
karakter - dat het zal vinden en vervolgens teruggeeft dat het een overeenkomst heeft gevonden.