sql >> Databáze >  >> RDS >> Mysql

MySQL length() vs char_length()

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


  1. Základy tabulkových výrazů, 3. část – Odvozené tabulky, úvahy o optimalizaci

  2. Použití pouze navigace pomocí klávesnice ve Wordu, Excelu a PowerPointu (Část 3:Panely úloh)

  3. Cheat Sheet pro výkon pro PostgreSQL

  4. Migrujte databázi z Postgresu do MySQL