CHR(0)
er det tegn, der bruges til at afslutte en streng i programmeringssproget C (blandt andre).
Når du sender CHR(0)
til funktionen vil den til gengæld videregive den til en funktion på et lavere niveau, der vil analysere de strenge, du har sendt i, og bygge et regulært udtryksmønster ud fra den streng. Dette regulære udtryksmønster vil se CHR(0)
og tror det er strengterminatoren og ignorer resten af mønsteret.
Opførselen er lettere at se med REGEXP_REPLACE
:
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
Hvad sker der, når du kører dette:
CHR(0)
kompileres til et regulært udtryk og bliver til en strengterminator.- Nu er mønsteret kun strengterminatoren, og mønsteret er derfor en nullængde streng.
- Det regulære udtryk matches derefter mod inputstrengen, og det læser det første tegn
a
og finder en nul-længde streng kan matches føra
så det erstatter intet, det har matchet føra
med end
giver outputtetda
. - Den gentages derefter for det næste tegn, der transformerer
b
tildb
. - og så videre, indtil du når slutningen af strengen, når den matcher nullængdemønsteret og tilføjer en sidste
d
.
Og du får outputtet:
dadbdcd_ded
(hvor _ er
Bemærk:CHR(0)
i input er ikke erstattet.
Hvis det klientprogram, du bruger, også trunkerer strengen ved CHR(0)
du kan muligvis ikke se hele outputtet (dette er et problem med, hvordan din klient repræsenterer strengen og ikke med Oracles output), men det kan også vises ved hjælp af DUMP()
:
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Udgange:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] Så hvad sker der med
REGEXP_LIKE( '1234567890', CHR(0) )
Det vil lave et regulært udtryksmønster med nul-længde streng, og det vil lede efter et match med nul-længde før 1
tegn - som den vil finde og så returnere, at den har fundet et match.