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