W MySQL wiele razy funkcja length()
funkcja i char_length()
funkcja zapewni dokładnie te same wyniki. Jednak są też chwile, w których wyniki będą zupełnie inne. Oto dlaczego.
Po pierwsze, oto definicja każdej z tych funkcji:
char_length()
- Zwraca długość ciągu mierzoną w znakach.
length()
- Zwraca długość łańcucha mierzoną w bajtach.
Zauważ, że „znaki” kontra „bajty” – jeden jest mierzony w znakach , druga jest mierzona w bajtach .
W wielu przypadkach liczba bajtów będzie taka sama jak liczba znaków w ciągu, ale nie zawsze tak jest. Liczba bajtów używanych na znak zależy od sposobu przechowywania danych. Na przykład, jeśli ciąg jest przechowywany jako dane Unicode, będą 2 bajty na znak.
Oto podstawowy przykład z użyciem tekstu ASCII (gdzie obie funkcje zwracają ten sam wynik):
SELECT CHAR_LENGTH('Lit'), LENGTH('Lit');
Wynik:
+--------------------+---------------+ | CHAR_LENGTH('Lit') | LENGTH('Lit') | +--------------------+---------------+ | 3 | 3 | +--------------------+---------------+
I często otrzymamy ten sam wynik, jeśli ciąg jest przechowywany w bazie danych:
SELECT CHAR_LENGTH(ArtistName), LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Wynik:
+-------------------------+--------------------+ | CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) | +-------------------------+--------------------+ | 3 | 3 | +-------------------------+--------------------+
Jeśli jednak zmienimy kolumnę bazy danych, aby przechowywać dane w formacie Unicode:
ALTER TABLE Artists MODIFY COLUMN ArtistName VARCHAR(255) unicode;
A następnie ponownie uruchom to samo zapytanie:
SELECT CHAR_LENGTH(ArtistName), LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Otrzymujemy inny wynik:
+-------------------------+--------------------+ | CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) | +-------------------------+--------------------+ | 3 | 6 | +-------------------------+--------------------+
Dzieje się tak, ponieważ Unicode przechowuje każdy znak jako 2 bajty.
Jest to podobne do różnicy między datalength()
i len()
w T-SQL.
MySQL ma również funkcję octet_length()
funkcja, która jest synonimem length()
.