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 SQLOCTET_LENGTH(). - Oracle překládá funkci
LENGTH()na standardní funkci SQLCHAR_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ádatLENGTH()ažOCTET_LENGTH(). - Při spuštění v režimu Oracle (tj.
sql_mode=ORACLE), překládáLENGTH()naCHAR_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() .