Seit Version 10.3.1 enthält MariaDB sowohl eine LENGTH() Funktion und ein LENGTHB() Funktion.
Das zweite hat ein B am Ende des Namens. Es ist also so etwas wie Length A und Length B , außer dass Length A hat nicht den A .
Verwirrt?
Das war ich, als ich zum ersten Mal auf LENGTHB() stieß . Ich kannte bereits LENGTH() , warum also eine „B“-Version?
Finden wir es heraus.
Oracle-Kompatibilität
Gemäß MariaDB-Ausgabe 12783 vor LENGTHB() eingeführt wurde (und vor LENGTH()). geändert wurde) funktionierte das so:
- MariaDB übersetzt die Funktion
LENGTH()zur SQL-StandardfunktionOCTET_LENGTH(). - Oracle übersetzt die Funktion
LENGTH()zur SQL-StandardfunktionCHAR_LENGTH().
Dann wurde die Entscheidung getroffen, MariaDBs LENGTH() zu ändern -Funktion, sodass sie sich unterschiedlich verhält, je nachdem, in welchem SQL-Modus sie ausgeführt wird. Insbesondere:
- Bei Ausführung im Standardmodus (d. h.
sql_mode=DEFAULT), wird MariaDB weiterhinLENGTH()übersetzen zuOCTET_LENGTH(). - Bei Ausführung im Oracle-Modus (d. h.
sql_mode=ORACLE), es übersetztLENGTH()zuCHAR_LENGTH()stattdessen.
Einführung von LENGTHB()
Das bringt uns zu LENGTHB() Funktion.
Die LENGTHB() Funktion wurde als Teil derselben Arbeit hinzugefügt.
LENGTHB() ist ein Synonym für OCTET_LENGTH() unabhängig vom SQL-Modus. Mit anderen Worten, LENGTHB() übersetzt zu OCTET_LENGTH() wenn sql_mode=DEFAULT und wenn sql_mode=ORACLE .
Dadurch können wir LENGTHB() verwenden in unserem Code, ohne sich Sorgen machen zu müssen, dass er vom sql_mode des Benutzers beeinflusst wird Einstellungen.
Der Unterschied
Der Unterschied zwischen diesen beiden Funktionen ist in der folgenden Tabelle dargestellt.
| Funktion | Standardmodus | Oracle-Modus |
|---|---|---|
LENGTH() | Gibt die Anzahl der Bytes zurück. | Gibt die Anzahl der Zeichen zurück. |
LENGTHB() | Gibt die Anzahl der Bytes zurück. | Gibt die Anzahl der Bytes zurück. |
Beachten Sie, dass dieser Unterschied erst ab MariaDB 10.3.1 vorhanden ist. Davor LENGTHB() existiert nicht und LENGTH() einfach übersetzt zu OCTET_LENGTH() .
Beispiel
Hier ist ein Beispiel, das den Unterschied zwischen LENGTH() demonstriert und LENGTHB() .
Lassen Sie uns unsere Sitzung so einstellen, dass sie den Standardmodus verwendet:
SET SESSION sql_mode=DEFAULT; Meine Sitzung war wahrscheinlich bereits im Standardmodus, aber es schadet nicht, ihn explizit einzustellen.
Lassen Sie uns nun LENGTH() ausführen und LENGTHB() mit demselben Argument:
SELECT
LENGTH('café'),
LENGTHB('café'); Ergebnis:
+-----------------+------------------+
| LENGTH('café') | LENGTHB('café') |
+-----------------+------------------+
| 5 | 5 |
+-----------------+------------------+ Im Standardmodus geben beide denselben Wert zurück.
In diesem Fall haben beide 5 zurückgegeben , da diese Zeichenfolge 5 Bytes enthält (der é Zeichen verwendet 2 Byte, und alle anderen verwenden jeweils 1 Byte).
Wechseln wir nun in den Oracle-Modus:
SET SESSION sql_mode=ORACLE; Lassen Sie uns nun die obige Anweisung wiederholen:
SELECT
LENGTH('café'),
LENGTHB('café'); Ergebnis:
+-----------------+------------------+
| LENGTH('café') | LENGTHB('café') |
+-----------------+------------------+
| 4 | 5 |
+-----------------+------------------+
Diesmal gibt es einen Unterschied zwischen den beiden Funktionen. Diesmal LENGTH() gab 4 zurück . Das ist 1 weniger als zuvor.
Das liegt daran, dass LENGTH() verhält sich im Oracle-Modus anders. Wie bereits erwähnt, wenn sql_mode=ORACLE , die LENGTH() Funktion übersetzt zu CHAR_LENGTH() , die die Anzahl der Zeichen zurückgibt – nicht Bytes.
Im vorherigen Beispiel LENGTH() gab die Anzahl der Bytes zurück, weil, wenn sql_mode=DEFAULT , übersetzt zu OCTET_LENGTH() .