MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MariaDB LENGTH() vs. LENGTHB():Was ist der Unterschied?

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-Standardfunktion OCTET_LENGTH() .
  • Oracle übersetzt die Funktion LENGTH() zur SQL-Standardfunktion CHAR_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 weiterhin LENGTH() übersetzen zu OCTET_LENGTH() .
  • Bei Ausführung im Oracle-Modus (d. h. sql_mode=ORACLE ), es übersetzt LENGTH() zu CHAR_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() .