UTF-8: Genel? Çöp Kutusu? Unicode?


279

Çeşitli veri türleri için hangi harmanlamayı kullanmam gerektiğini anlamaya çalışıyorum. Depolayacağım içeriğin% 100'ü kullanıcı tarafından gönderildi.

Anladığım kadarıyla UTF-8 İkili yerine UTF-8 Genel CI (Büyük / Küçük Harfe Duyarsız) kullanmalıyım. Ancak UTF-8 Genel CI ve UTF-8 Unicode CI arasında net bir ayrım bulamıyorum.

  1. Kullanıcı tarafından gönderilen içeriği UTF-8 General veya UTF-8 Unicode CI sütunlarında mı saklamalıyım?
  2. UTF-8 Binary ne tür verilere uygulanabilir?

16
Yan not ama bunun yerine tam UTF-8 desteği için utf8kullanın utf8mb4. Burada yorum yapmak, çünkü bu popüler sorunun cevapları buna değinmiyor. mathiasbynens.be/notes/mysql-utf8mb4
Steven R. Loomis

Büyük / küçük harf katlama, ancak aksan duyarlılığı istiyorsanız, lütfen bugs.mysql.com adresine bir istekte bulunun .
Rick James

Yanıtlar:


299

Genel olarak, utf8_general_ci utf8_unicode_ci'den daha hızlıdır , ancak daha az doğrudur.

Fark şu:

Herhangi bir Unicode karakter kümesi için, _general_ci harmanlama kullanılarak gerçekleştirilen işlemler _unicode_ci harmanlama işleminden daha hızlıdır . Örneğin, utf8_general_ci harmanlama karşılaştırmaları utf8_unicode_ci karşılaştırmasından daha hızlıdır, ancak biraz daha az doğrudur. Bunun nedeni utf8_unicode_ci'nin genişletme gibi eşlemeleri desteklemesi; diğer bir deyişle, bir karakter diğer karakterlerin kombinasyonlarıyla eşit olarak karşılaştırıldığında. Örneğin, Almanca ve diğer bazı dillerde “ß” “ss” e eşittir. utf8_unicode_ci kasılmaları ve cahil karakterleri de destekler. utf8_general_ci, genişletmeleri, kasılmaları veya cahil karakterleri desteklemeyen eski bir harmanlamadır. Karakterler arasında sadece bire bir karşılaştırma yapabilir.

Alıntı sahibi: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

Daha ayrıntılı açıklama için lütfen MySQL forumlarından şu yayını okuyun: http://forums.mysql.com/read.php?103,187048,188748

Utf8_bin için: Hem utf8_general_ci hem de utf8_unicode_ci büyük / küçük harfe duyarlı olmayan karşılaştırma yapar. Buna karşılık, utf8_bin, karakterlerin ikili değerlerini karşılaştırdığından büyük / küçük harfe duyarlıdır (diğer farklılıklar arasında).


2
Bence _unicode_ci kullanmak için iyi bir nedeniniz yoksa _general_ci kullanın.
Sagi

4
Bu soruya gerçekten derinlemesine cevap vermiyor. Bu harmanlamalar arasındaki fark tam olarak nedir?
Pekka

4
Haklısın, basitlik için burada kesin fark sağlanmadı. Tam olarak bir farkla bir gönderi bağlantısı ekledim .
Sagi

NB show collation;, her karakter kümesi için varsayılan harmanlamayı görmenizi sağlar. 5.1 utf8_general_ciiçin varsayılan olarak gösterilir utf8.
David Carboni

9
İki harmanlama arasındaki gerçek hız farkında daha derinlemesine gidecek kaynaklar var mı? Performansta% 0.1'lik bir düşüş veya% 10'luk bir düşüşten mi bahsediyoruz?
Emphram Stavanger

90

Ayrıca, bir varchar alanını benzersiz veya birincil dizin olarak 'a' ve 'á' gibi 2 değer ekleyerek kullanırken utf8_general_ci ile yinelenen bir anahtar hatası vereceğinin farkında olmalısınız.


3
Teşekkürler, bu benzer kullanıcı adlarından kaçınmak için yararlıdır (örneğin "jose" varsa, başka birisinin "josé" kullanıcısı oluşturmasını istemezim) NB: bu aynı zamanda utf8 harmanlamalarının çoğu için de geçerlidir (utf8_bin hariç). En güvenli / en güvenli / en kapsamlıutf8_unicode_ci
Costa

2
Jose ve josé'nin dizinde ayırt edilmesini istediğim yerde utf8_bin kullanıyorum. Örneğin, kullanıcının josé aramaya ve jose ile değiştirmesine karar vermiş olabilecek arama / değiştirme işlemlerini kaydeden bir sütun. (Bir elektronik tablo programı yazıyorum)
Buttle Butkus

33
  • utf8_binbitleri körü körüne karşılaştırır. Vaka katlama yok, aksan sıyırma yok.
  • utf8_general_cibir baytı bir baytla karşılaştırır. Vaka katlama ve vurgu sıyırma işlemlerini yapar, ancak 2 karakterli karşılaştırmalar yoktur: bu harmanlamada ijeşit değildir ij.
  • utf8_*_cidile özgü kurallar kümesidir, ancak bunun gibi unicode_ci. Bazı özel durumlarda: Ç, Č, ch,ll
  • utf8_unicode_cikarşılaştırmalar için eski bir Unicode standardını izler. ij= ij, ama ae! =æ
  • utf8_unicode_520_cidaha yeni bir Unicode standardını izler. ae=æ

Çeşitli utf8 harmanlamalarında neyin eşit olduğuna ilişkin ayrıntılar için harmanlama tablosuna bakın .

utf8, MySQL tarafından tanımlandığı gibi 1- ila 3 baytlık utf8 kodları ile sınırlıdır. Bu Emoji ve bazı Çinlileri bırakır. Dolayısıyla, utf8mb4Avrupa'nın ötesine geçmek istiyorsanız gerçekten geçiş yapmalısınız .

Yukarıdaki noktalar utf8mb4, uygun yazım değişikliği sonrasında geçerlidir . İleriye utf8mb4ve utf8mb4_unicode_520_citercih edilir.

  • utf16 ve utf32, utf8'deki varyantlardır; onlar için neredeyse hiç faydası yok.
  • ucs2 "Unicode" a "utf8" den daha yakındır; neredeyse hiç faydası yok.

1
Re "kalmak": 8.0 harmanlama çeşitli karakterler, diphthongs, vb, 8.0 utf8mb4 harmanlama karşılaştırmak gösterir; utf8 çoğunlukla aynıdır.
Rick James

8.0 harmanlama, 5.x'ten önemli ölçüde daha hızlı olacak şekilde ayarlanmıştır.
Rick James

bu sayfada en üstte utf8mb4_bin listelenirse iyi olur. Karakter eşleşmesi olmadığını biliyorum, ama yeni başlayanlar için iyi.
Henk Poley

6

Gerçekten, sütunda 'é' ve 'e' gibi değerlerin kaydedilmesini benzersiz bir dizinle test ettim ve hem 'utf8_unicode_ci' hem de 'utf8_general_ci' üzerinde çift hataya neden oldular. Bunları yalnızca 'utf8_bin' harmanlanmış sütununa kaydedebilirsiniz.

Ve mysql dokümanları ( http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) örnek setinde 'utf8_general_ci' harmanlamasını önerir.

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

1
Bu konuda hızlı bir test yaptım ve doğru gibi görünüyor. Bir sütunda benzersiz bir anahtar ve tildes ve benzeri değerler söz konusu olduğunda her iki harmanlama da aynı şekilde davranır.
MirroredFate

@MirroredFate Tamam, orada sütun bu hataya neden için benzersiz bir dizin olması gerektiğini eklemeliyim. Cevabımda ima ediyor.
vitalii

3

Kabul edilen cevap eski.

Eğer MySQL 5.5.3+ kullanırsanız kullanın utf8mb4_unicode_ciyerine utf8_unicode_cisize hataları vermeyecektir sizin kullanıcıların yazdığı karakterleri sağlamak için.

utf8mb4emojileri destekler, ancak utf8yüzlerce kodlama ile ilgili hataları size verebilir:

Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1


Bu Yanıt (doğru) Emoji (ve bazı Çince) kodlama ile ilgili sorunları giderir. Ancak Soru Harmanlama'ya odaklanmış gibi görünüyor. utf8mb4_unicode_ci(Sanırım) tüm Emoji'ye eşit davranır. utf8mb4_unicode_520_ciEmoji'ye emir verir.
Rick James
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.