sql >> Databáze >  >> RDS >> MariaDB

MariaDB LENGTH() vs LENGTHB():Jaký je rozdíl?

Již od verze 10.3.1 MariaDB obsahuje LENGTH() funkce a LENGTHB() funkce.

Ten druhý má B na konci jména. Je to něco jako Length A a Length B , kromě Length A nemá A .

Zmatený?

Byl jsem, když jsem poprvé narazil na LENGTHB() . Už jsem věděl o LENGTH() , tak proč je potřeba verze „B“?

Pojďme to zjistit.

Kompatibilita s Oracle

Podle vydání MariaDB 12783 před LENGTHB() byl představen (a před LENGTH() byl upraven) věci fungovaly takto:

  • MariaDB překládá funkci LENGTH() na standardní funkci SQL OCTET_LENGTH() .
  • Oracle překládá funkci LENGTH() na standardní funkci SQL CHAR_LENGTH() .

Poté bylo přijato rozhodnutí změnit LENGTH() MariaDB funkce, takže se chová odlišně v závislosti na režimu SQL, ve kterém běží. Konkrétně:

  • Při spuštění ve výchozím režimu (tj. sql_mode=DEFAULT ), MariaDB bude nadále překládat LENGTH()OCTET_LENGTH() .
  • Při spuštění v režimu Oracle (tj. sql_mode=ORACLE ), překládá LENGTH() na CHAR_LENGTH() místo toho.

Představujeme LENGTHB()

Což nás přivádí k LENGTHB() funkce.

LENGTHB() funkce byla přidána jako součást stejné práce.

LENGTHB() je synonymem pro OCTET_LENGTH() bez ohledu na režim SQL. Jinými slovy LENGTHB() překládá do OCTET_LENGTH() když sql_mode=DEFAULT a když sql_mode=ORACLE .

To nám umožňuje používat LENGTHB() v našem kódu, aniž byste se museli obávat, že to bude ovlivněno uživatelským sql_mode nastavení.

Rozdíl

Rozdíl mezi těmito dvěma funkcemi je nastíněn v následující tabulce.

Funkce Výchozí režim Režim Oracle
LENGTH() Vrátí počet bajtů. Vrátí počet znaků.
LENGTHB() Vrátí počet bajtů. Vrátí počet bajtů.

Všimněte si, že tento rozdíl je přítomen pouze od MariaDB 10.3.1. Předtím LENGTHB() neexistuje a LENGTH() jednoduše se přeloží na OCTET_LENGTH() .

Příklad

Zde je příklad, který ukazuje rozdíl mezi LENGTH() a LENGTHB() .

Nastavíme naši relaci tak, aby používala výchozí režim:

SET SESSION sql_mode=DEFAULT;

Moje relace byla pravděpodobně již ve výchozím režimu, ale není na škodu to explicitně nastavit.

Nyní spustíme LENGTH() a LENGTHB() se stejným argumentem:

SELECT 
    LENGTH('café'),
    LENGTHB('café');

Výsledek:

+-----------------+------------------+
| LENGTH('café')  | LENGTHB('café')  |
+-----------------+------------------+
|               5 |                5 |
+-----------------+------------------+

Takže když jsou ve výchozím režimu, oba vrátí stejnou hodnotu.

V tomto případě obě vrátily 5 , protože v tomto řetězci je 5 bajtů (é znak používá 2 bajty a všechny ostatní používají každý 1 bajt).

Nyní přejdeme do režimu Oracle:

SET SESSION sql_mode=ORACLE;

Nyní zopakujme výše uvedené prohlášení:

SELECT 
    LENGTH('café'),
    LENGTHB('café');

Výsledek:

+-----------------+------------------+
| LENGTH('café')  | LENGTHB('café')  |
+-----------------+------------------+
|               4 |                5 |
+-----------------+------------------+

Tentokrát je mezi těmito dvěma funkcemi rozdíl. Tentokrát LENGTH() vrátil 4 . To je o 1 méně než dříve.

Důvodem je LENGTH() se v režimu Oracle chová jinak. Jak bylo zmíněno, když sql_mode=ORACLE , LENGTH() funkce se převede na CHAR_LENGTH() , která vrací počet znaků – nikoli bajtů.

V předchozím příkladu LENGTH() vrátil počet bajtů, protože když sql_mode=DEFAULT , překládá se do OCTET_LENGTH() .


  1. Oracle to PostgreSQL:Syntaxe vnějšího spojení ANSI v PostgreSQL

  2. Jak provádět průběžné upgrady pro MySQL

  3. Referenční alias (vypočítaný v SELECT) v klauzuli WHERE

  4. Jak získat záznamy z posledních 24 hodin v MySQL