MySQL - char_length () ile length () karşılaştırması


215

Arasındaki temel fark nedir length()ve char_length()?

İkili ve ikili olmayan dizelerle ilgili bir şey olduğuna inanıyorum. Dizeleri ikili olarak saklamanın pratik bir nedeni var mı?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)

2
Evet, ikili dizeleri aslında ikili dizelerken, örneğin sıkıştırılmış olarak saklamanın pratik nedenleri vardır.
sanmai

Yanıtlar:


351

LENGTH()bayt cinsinden ölçülen dizenin uzunluğunu döndürür . karakter cinsinden ölçülen dizenin
CHAR_LENGTH() uzunluğunu döndürür .

Bu özellikle, çoğu karakterin iki baytta kodlandığı Unicode için geçerlidir. Veya bayt sayısının değiştiği UTF-8. Örneğin:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

Gördüğünüz gibi Euro işareti 0xE282ACsadece bir karakter olmasına rağmen 3 bayt kaplar ( UTF-8'de olduğu gibi kodlanır ).


6
Sadece UCS-2 karakter başına iki bayt olarak kodlanır. Bu kodlama (veya daha doğru bir şekilde UTF-16LE) Windows'un yanıltıcı bir şekilde “Unicode” dediği şeydir. MySQL, UTF-16'yı desteklemez; bunun yerine Unicode dizelerini koymak için genel yaklaşım UTF-8 kullanmaktır.
bobince

2
Örneğin: uzunluk ('日本語'), char_length ('日本語') seçin;
sanmai

@bobince: UCS-2 bile bazı karakterleri 2 bayttan fazla kodlar 0313 combining comma above. A = 61 olduğundan, 0x00610313 a̓ olarak görüntülenir ve 4 bayt alır.
Andomar

2
Aslında Unicode terminolojisi ile hala 2 karakterdir, ancak tüm birleştirme işaretleri gibi - uygun bir yazı tipi varsa - tek bir glif olarak görüntülenebilir. UTF-16LE, taşıyıcılar sayesinde yine de 4 baytlık bir karaktere sahip olabilir.
bobince

6
Peki VARCHAR sütunlarımı nasıl yeniden boyutlandıracağımı anlarken bu işlevlerden hangisini kullanmalıyım? Tablo oluştururken bir sütunun bir VARCHAR (10) olduğunu varsayalım. Bu en fazla 10 karaktere veya en fazla 10 bayta izin verir mi?
still_dreaming_1

19

varchar (10), 10 bayttan fazla olabilen 10 karakter depolayacaktır. Dizinlerde, alanın maksimum uzunluğunu tahsis eder - bu nedenle UTF8-mb4 kullanıyorsanız, 10 karakter alanı için 40 bayt tahsis eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.