Utf8 ve latin1 arasındaki farklar


128

utf8 ve latin1 arasındaki fark nedir?


3
Bunlar farklı kodlamalardır ( bazı karakterlerin ortak bayt dizileriyle eşleştirildiği, örneğin ASCII karakterleri ve birçok aksanlı harf). UTF-8, tüm kod noktalarıyla birlikte bir Unicode kodlamasıdır; Latin1, 256 karakterden daha azını kodlar.
ShreevatsaR

Ayrıca Linux yerel ayarlarında bulunan ve şu soruda bahsedilebilecek
latin9 da var

Yanıtlar:


151

UTF-8 dünya hakimiyeti için hazırlanmıştır, Latin1 değildir.

Latin1 kodlamasını kullanarak Çince, Japonca, İbranice, Rusça vb. Latin olmayan karakterleri depolamaya çalışıyorsanız, sonunda mojibake olurlar . Bu makalenin giriş metnini faydalı bulabilirsiniz (ve biraz Java biliyorsanız daha da fazlasını).

Tam 4 baytlık UTF-8 desteğinin yalnızca MySQL 5.5'te sunulduğunu unutmayın. Bu sürümden önce, karakter başına 4 bayta değil, karakter başına yalnızca 3 bayta kadar çıkıyor. Yani Emoji uçağını değil sadece BMP düzlemini destekledi. Tam 4 bayt UTF-8 desteği istiyorsanız, MySQL'i en az 5.5'e yükseltin veya PostgreSQL gibi başka bir RDBMS'ye gidin. MySQL 5.5+ olarak adlandırılır utf8mb4.


31
Mysql 5.1, 3 bayt UTF-8'i destekler, ancak Mysql 5.5 , utf8mb4 olarak 4 bayt UTF-8'i destekler.
velcrow

2
@BalusC UTF-8'in nasıl tam olarak desteklenmediği konusunda daha fazla ayrıntı verebilir misiniz? Mysql 5.1'in tüm unicode karakterlerini saklayamayacağı anlamına mı geliyor ?
Pacerier

2
@Pacerier: karakter başına yalnızca 3 baytı destekler, bu nedenle yalnızca BMP (ilk 65535 karakter) desteklenir, kalan desteklenmez. Tüm karakterler için bkz.
En.wikipedia.org/wiki/Plane_(Unicode

2
@BalusC 5.1.63 kullanan ve web sunucusunun mysql sürümünü güncelleme ayrıcalığına sahip olmayanlara gelince, alternatifler neler olabilir?
Pacerier

6
@Pacerier: Bunun VARBINARYyerine kaydedebilir VARCHARve işletme katmanında kendiniz kod çözebilir / kodlayabilirsiniz, ancak bu hilekârdır. Yeni bir soru sormayı düşünün, belki daha iyi yollar vardır.
BalusC

47

Latin1'de her karakter tam olarak bir bayt uzunluğundadır. Utf8'de bir karakter birden fazla bayttan oluşabilir. Sonuç olarak, utf8, latin1'den daha fazla karaktere sahiptir (ve ortak oldukları karakterler mutlaka aynı bayt / bayt sırasıyla temsil edilmeyebilir).


1
Ascii ve bin ne olacak?
Yousha Aleayoub

8
@YoushaAleayoub ASCII, 0'dan 127'ye kadar olan karakterleri kullanan tek baytlık bir kodlamadır, böylece latin1'in yarısı kadar karakter kodlayabilir. Hem latin1 hem de utf8'in katı bir alt kümesidir, yani hem latin1 hem de utf8'de 0'dan 127'ye kadar olan baytlar ASCII'de yaptıklarıyla aynı şeyleri kodlar. Bin bir kodlama değildir. Genellikle bir dosyayı okurken verebileceğiniz bir seçenektir, IO işlevlerine herhangi bir kodlama uygulamamalarını söyler, bunun yerine dosyayı bayt bayt okuyun.
eylül

1
teşekkürler, binaryharmanlamayı kastetmiştim ...? ve ingilizce / sayısal alanlar için hangisi daha iyidir: ascii_general_civeya ascii_bin?
Yousha Aleayoub
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.