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