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