sql >> Databasteknik >  >> RDS >> Oracle

CHR(0) i REGEXP_LIKE

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öre a så det ersätter ingenting det har matchat före a med en d ger utdata da .
  • Det kommer sedan att upprepas för nästa tecken som transformerar b till db .
  • 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.



  1. Hämta det senaste (senaste) distinkta högsta värdet

  2. Förhindra dubbletter av poster till en tabell med PHP

  3. Skripta över ssh genom kitt på windows

  4. Är $_SESSION säker från sql-injektioner?