V MySQL se mnohokrát vyskytuje length()
funkce a char_length()
funkce poskytne přesně stejné výsledky. Jsou však i chvíle, kdy budou výsledky úplně jiné. Zde je důvod.
Nejprve je zde definice každé z těchto funkcí:
char_length()
- Vrátí délku řetězce měřenou ve znacích.
length()
- Vrátí délku řetězce měřenou v bajtech.
Všimněte si „znaků“ vs. „bajtů“ – jeden se měří v znakech , druhý se měří v bajtech .
V mnoha případech bude počet bajtů stejný jako počet znaků v řetězci, ale není tomu tak vždy. Počet použitých bajtů na znak závisí na tom, jak jsou data uložena. Pokud je například řetězec uložen jako data Unicode, bude mít každý znak 2 bajty.
Zde je základní příklad použití textu ASCII (kde obě funkce vracejí stejný výsledek):
SELECT CHAR_LENGTH('Lit'), LENGTH('Lit');
Výsledek:
+--------------------+---------------+ | CHAR_LENGTH('Lit') | LENGTH('Lit') | +--------------------+---------------+ | 3 | 3 | +--------------------+---------------+
A často dostaneme stejný výsledek, pokud je řetězec uložen v databázi:
SELECT CHAR_LENGTH(ArtistName), LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Výsledek:
+-------------------------+--------------------+ | CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) | +-------------------------+--------------------+ | 3 | 3 | +-------------------------+--------------------+
Pokud však změníme sloupec databáze tak, aby se data ukládala jako unicode:
ALTER TABLE Artists MODIFY COLUMN ArtistName VARCHAR(255) unicode;
A pak spusťte stejný dotaz znovu:
SELECT CHAR_LENGTH(ArtistName), LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Dostaneme jiný výsledek:
+-------------------------+--------------------+ | CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) | +-------------------------+--------------------+ | 3 | 6 | +-------------------------+--------------------+
Je to proto, že unicode ukládá každý znak jako 2 bajty.
Je to podobné jako rozdíl mezi datalength()
a len()
v T-SQL.
MySQL má také octet_length()
funkce, což je synonymum pro length()
.