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() .