В MySQL има много пъти, когато length()
функция и char_length()
функция ще осигури абсолютно същите резултати. Въпреки това, има и моменти, когато резултатите ще бъдат напълно различни. Ето защо.
Първо, ето дефиницията за всяка от тези функции:
char_length()
- Връща дължината на низ, измерена в знаци.
length()
- Връща дължината на низ, измерена в байтове.
Забележете „символи“ срещу „байтове“ – единият се измерва в знаци , другият се измерва в байтове .
В много случаи броят на байтовете ще бъде същият като броя на знаците в низа, но това не винаги е така. Броят на използваните байтове на знак зависи от това как се съхраняват данните. Например, ако низът се съхранява като Unicode данни, ще има 2 байта на знак.
Ето основен пример за използване на ASCII текст (където и двете функции връщат един и същ резултат):
SELECT CHAR_LENGTH('Lit'), LENGTH('Lit');
Резултат:
+--------------------+---------------+ | CHAR_LENGTH('Lit') | LENGTH('Lit') | +--------------------+---------------+ | 3 | 3 | +--------------------+---------------+
И често ще получим същия резултат, ако низът се съхранява в база данни:
SELECT CHAR_LENGTH(ArtistName), LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Резултат:
+-------------------------+--------------------+ | CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) | +-------------------------+--------------------+ | 3 | 3 | +-------------------------+--------------------+
Въпреки това, ако променим колоната на базата данни, за да съхранявате данните като unicode:
ALTER TABLE Artists MODIFY COLUMN ArtistName VARCHAR(255) unicode;
След това изпълнете отново същата заявка:
SELECT CHAR_LENGTH(ArtistName), LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Получаваме различен резултат:
+-------------------------+--------------------+ | CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) | +-------------------------+--------------------+ | 3 | 6 | +-------------------------+--------------------+
Това е така, защото unicode съхранява всеки знак като 2 байта.
Това е подобно на разликата между datalength()
и len()
в T-SQL.
MySQL също има octet_length()
функция, която е синоним на length()
.