Lige siden version 10.3.1 har MariaDB inkluderet både en LENGTH()
funktion og en LENGTHB()
funktion.
Den anden har en B
i slutningen af navnet. Så det er lidt ligesom Length A
og Length B
, bortset fra at Length A
har ikke A
.
Forvirret?
Det var jeg, da jeg første gang stødte på LENGTHB()
. Jeg kendte allerede til LENGTH()
, så hvorfor behovet for en "B"-version?
Lad os finde ud af det.
Oracle-kompatibilitet
Ifølge MariaDB udgave 12783, før LENGTHB()
blev introduceret (og før LENGTH()
blev ændret) fungerede tingene sådan her:
- MariaDB oversætter funktionen
LENGTH()
til SQL Standard funktionOCTET_LENGTH()
. - Oracle oversætter funktionen
LENGTH()
til SQL Standard funktionCHAR_LENGTH()
.
Beslutningen blev derefter truffet om at ændre MariaDBs LENGTH()
funktion, så den opfører sig anderledes, afhængig af hvilken SQL-tilstand den kører i. Specifikt:
- Når du kører i standardtilstand (dvs.
sql_mode=DEFAULT
), vil MariaDB fortsætte med at oversætteLENGTH()
tilOCTET_LENGTH()
. - Men når du kører i Oracle-tilstand (dvs.
sql_mode=ORACLE
), det oversætterLENGTH()
tilCHAR_LENGTH()
i stedet.
Introduktion af LENGTHB()
Hvilket bringer os til LENGTHB()
fungere.
LENGTHB()
funktion blev tilføjet som en del af det samme arbejde.
LENGTHB()
er et synonym for OCTET_LENGTH()
uanset SQL-tilstand. Med andre ord, LENGTHB()
oversættes til OCTET_LENGTH()
når sql_mode=DEFAULT
og når sql_mode=ORACLE
.
Dette gør det muligt for os at bruge LENGTHB()
i vores kode uden at bekymre dig om, at den bliver påvirket af brugerens sql_mode
indstillinger.
Forskellen
Forskellen mellem disse to funktioner er skitseret i følgende tabel.
Funktion | Standardtilstand | Oracle Mode |
---|---|---|
LENGTH() | Returnerer antallet af bytes. | Returnerer antallet af tegn. |
LENGTHB() | Returnerer antallet af bytes. | Returnerer antallet af bytes. |
Bemærk, at denne forskel kun er til stede fra MariaDB 10.3.1. Før det, LENGTHB()
eksisterer ikke, og LENGTH()
oversættes blot til OCTET_LENGTH()
.
Eksempel
Her er et eksempel, der viser forskellen mellem LENGTH()
og LENGTHB()
.
Lad os indstille vores session til at bruge standardtilstanden:
SET SESSION sql_mode=DEFAULT;
Min session var sandsynligvis allerede i standardtilstanden, men der er ingen skade i eksplicit at indstille den.
Lad os nu køre LENGTH()
og LENGTHB()
med samme argument:
SELECT
LENGTH('café'),
LENGTHB('café');
Resultat:
+-----------------+------------------+ | LENGTH('café') | LENGTHB('café') | +-----------------+------------------+ | 5 | 5 | +-----------------+------------------+
Så når de er i standardtilstand, returnerer de begge den samme værdi.
I dette tilfælde returnerede de begge 5
, fordi der er 5 bytes i den streng (é
tegn bruger 2 byte, og alle andre bruger 1 byte hver).
Lad os nu skifte til Oracle-tilstand:
SET SESSION sql_mode=ORACLE;
Lad os nu køre ovenstående erklæring igen:
SELECT
LENGTH('café'),
LENGTHB('café');
Resultat:
+-----------------+------------------+ | LENGTH('café') | LENGTHB('café') | +-----------------+------------------+ | 4 | 5 | +-----------------+------------------+
Denne gang er der forskel på de to funktioner. Denne gang LENGTH()
returnerede 4
. Det er 1 mindre end tidligere.
Dette er fordi LENGTH()
opfører sig anderledes i Oracle-tilstand. Som nævnt, når sql_mode=ORACLE
, LENGTH()
funktion oversættes til CHAR_LENGTH()
, som returnerer antallet af tegn – ikke bytes.
I det foregående eksempel, LENGTH()
returnerede antallet af bytes fordi, når sql_mode=DEFAULT
, det oversættes til OCTET_LENGTH()
.