sql >> Database teknologi >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB():Hvad er forskellen?

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 funktion OCTET_LENGTH() .
  • Oracle oversætter funktionen LENGTH() til SQL Standard funktion CHAR_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ætte LENGTH() til OCTET_LENGTH() .
  • Men når du kører i Oracle-tilstand (dvs. sql_mode=ORACLE ), det oversætter LENGTH() til CHAR_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() .


  1. Sådan formateres SQLite-resultater som en tabel

  2. Sådan automatiseres Galera Cluster ved hjælp af ClusterControl CLI

  3. Hvordan sender man e-mail fra SQL Server?

  4. PostgreSQL streaming replikering vs logisk replikering