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