utf8_general_cive
utf8_unicode_ci` arasında performans açısından herhangi bir fark var mı?
Bu iki harmanlamanın her ikisi de UTF-8 karakter kodlaması içindir. Farklılıklar metnin nasıl sıralandığı ve karşılaştırıldığı ile ilgilidir.
Not: utf8
yerine utf8mb4
kullanmalısınız. Her ikisi de UTF-8 kodlamasına atıfta bulunur, ancak eski utf8
0xFFFD'nin üzerinde numaralandırılmış karakterlerin kullanımını engelleyen MySQL'e özgü bir sınırlamaya sahiptir.
Not: MySQL'in daha yeni sürümleri, Unicode 9.0'a dayalı kurallar için utf8mb4_0900_ci
gibi isimler altında mevcut olan ve eşdeğer genel
varyantı olmayan güncellenmiş Unicode sıralama kurallarına sahiptir.
Anahtar farklılıklar
utf8mb4_unicode_ci
, evrensel sıralama ve karşılaştırma için resmi Unicode kurallarını temel alır ve çok çeşitli dillerde doğru bir şekilde sıralama yapar.utf8mb4_general_ci
, hızı artırmak için tasarlanmış birçok kısa yolu kullanırken yapabildiği kadar iyi yapmayı amaçlayan basitleştirilmiş bir sıralama kuralları kümesidir. Unicode kurallarına uymaz ve belirli dillerin veya karakterlerin kullanılması gibi bazı durumlarda istenmeyen sıralama veya karşılaştırma ile sonuçlanacaktır.
Modern sunucularda bu performans artışı yok denecek kadar az olacaktır. Sunucuların günümüz bilgisayarlarının CPU performansının çok küçük bir kısmına sahip olduğu bir dönemde geliştirilmiştir.
Not: utf8mb4_unicode_ci
nin utf8mb4_0900_ai_ci
adında güncellenmiş bir sürümü bulunmaktadır - bu sürüm Unicode sürüm 9.0'daki değişikliklere dayanmaktadır ve görünüşe göre daha hızlıdır. Yeni bir adlandırma şeması benimser; 0900
Unicode sürümüdür ve ai
aksana duyarsız anlamına gelir - önceki utf8mb4_unicode_ci
gibi, harflerdeki aksanlar önemli kabul edilmez.
utf8mb4_unicode_ci
nin utf8mb4_general_ci
ye göre avantajları
Sıralama ve karşılaştırma için Unicode kurallarını kullanan utf8mb4_unicode_ci
, çok çeşitli dillerde ve çok çeşitli özel karakterler kullanıldığında doğru sıralama için oldukça karmaşık bir algoritma kullanır. Bu kuralların dile özgü gelenekleri dikkate alması gerekir; herkes karakterlerini 'alfabetik sıra' olarak adlandırdığımız şekilde sıralamaz.
Latin (yani "Avrupa") dilleri söz konusu olduğunda, Unicode sıralaması ile MySQL'deki basitleştirilmiş `utf8mb4_general_ci' sıralaması arasında çok fazla fark yoktur, ancak yine de birkaç farklılık vardır:utf8mb4_general_ci
bunları tek karakter olarak sıralar (muhtemelen sırasıyla "s" ve "e" gibi).utf8mb4_unicode_ci
bunları düzgün bir şekilde işler.
Asya dilleri veya farklı alfabelere sahip diller gibi latin olmayan dillerde, Unicode sıralaması ile basitleştirilmiş utf8mb4_general_ci
sıralaması arasında çok daha fazla* fark olabilir. utf8mb4_general_cinin uygunluğu büyük ölçüde kullanılan dile bağlı olacaktır. Bazı diller için oldukça yetersiz kalacaktır. **Ne kullanmalısınız? Artık
utf8mb4_general_cikullanmak için neredeyse hiçbir neden yok, çünkü CPU hızının performans farkının önemli olacağı kadar düşük olduğu noktayı geride bıraktık. Veritabanınız neredeyse kesinlikle bundan başka darboğazlarla sınırlı olacaktır. Geçmişte bazı kişiler, doğru sıralamanın performans maliyetini haklı çıkaracak kadar önemli olacağı durumlar dışında
utf8mb4_general_cikullanılmasını tavsiye ediyordu. Bugün, bu performans maliyeti neredeyse ortadan kalktı ve geliştiriciler uluslararasılaştırmayı daha ciddi bir şekilde ele alıyor. Eğer hız sizin için doğruluktan daha önemliyse, hiç sıralama yapmasanız da olur. Doğru olması gerekmiyorsa bir algoritmayı daha hızlı hale getirmek önemsizdir. Dolayısıyla,
utf8mb4_general_cimuhtemelen hız nedenleriyle gerekli olmayan ve muhtemelen doğruluk nedenleriyle de uygun olmayan bir uzlaşmadır. Ekleyeceğim bir diğer şey de, uygulamanızın yalnızca İngilizce dilini desteklediğini bilseniz bile, doğru sıralamanın aynı derecede önemli olduğu diğer dillerde kullanılan karakterleri içerebilen kişi adlarıyla ilgilenmesi gerekebileceğidir. Her şey için Unicode kurallarını kullanmak, çok zeki Unicode çalışanlarının sıralamanın düzgün çalışması için çok sıkı çalıştıkları konusunda içinizin rahat etmesine yardımcı olur. **Parçalar ne anlama geliyor** İlk olarak,
ci*harf büyüklüğüne duyarsız* sıralama ve karşılaştırma içindir. Bu, metinsel veriler için uygun olduğu ve büyük/küçük harfin önemli olmadığı anlamına gelir. Diğer harmanlama türleri, büyük/küçük harfin önemli olduğu metinsel veriler için
cs(büyük/küçük harfe duyarlı) ve kodlamanın bit bit eşleşmesi gereken, gerçekten ikili veri olarak kodlanmış alanlar (örneğin Base64 dahil) için uygun olan
bindir. Büyük/küçük harfe duyarlı sıralama bazı garip sonuçlara yol açar ve büyük/küçük harfe duyarlı karşılaştırma yalnızca harf büyük/küçük harf farkı olan yinelenen değerlerle sonuçlanabilir, bu nedenle büyük/küçük harmanlamalar metinsel veriler için gözden düşmektedir - büyük/küçük harf sizin için önemliyse, aksi takdirde göz ardı edilebilecek noktalama işaretleri vb. de muhtemelen önemlidir ve ikili bir harmanlama daha uygun olabilir. Daha sonra,
unicodeveya
generalbelirli sıralama ve karşılaştırma kurallarını, özellikle de metnin normalleştirilme veya karşılaştırılma şeklini ifade eder. utf8mb4 karakter kodlaması için birçok farklı kural kümesi vardır,
unicodeve
generalbelirli bir dil yerine tüm olası dillerde iyi çalışmaya çalışan iki tanesidir. Bu iki kural kümesi arasındaki farklar bu yanıtın konusudur. unicode
un Unicode 4.0 kurallarını kullandığını unutmayın. MySQL'in son sürümleri Unicode 5.2 kurallarını kullanan unicode_520
ve Unicode 9.0 kurallarını kullanan 0900
("unicode_" kısmını çıkararak) kural kümelerini eklemektedir.
Ve son olarak, utf8mb4
elbette dahili olarak kullanılan karakter kodlamasıdır. Bu cevapta sadece Unicode tabanlı kodlamalardan bahsediyorum.Bu yazı bunu çok güzel açıklıyor.
Kısaca: utf8_unicode_ci, Unicode standartlarında tanımlandığı gibi Unicode Harmanlama Algoritmasını kullanırken, utf8_general_ci, "daha az doğru" sıralama sonuçlarına neden olan daha basit bir sıralama düzenidir.
Mysql el kitabı, Unicode Karakter Kümeleri bölümüne bakın:
Herhangi bir Unicode karakter kümesi için, kullanılarak gerçekleştirilen işlemler _general_ci harmanlaması, _unicode_ci harmanlaması için olanlardan daha hızlıdır. Örneğin, karşılaştırmalar utf8_general_ci harmanlaması daha hızlıdır, ama biraz daha az doğru, daha utf8_unicode_ci için karşılaştırmalar. Bu Bunun nedeni şudur utf8_unicode_ci aşağıdaki gibi eşlemeleri destekler genişleme olarak; yani, bir karakteri aşağıdakilere eşit olarak karşılaştırılır diğer karakterlerin kombinasyonları. İçin örneğin, Almanca ve diğer bazı dillerde diller "ß" "ss "ye eşittir. utf8_unicode_ci ayrıca şunları da destekler kısaltmalar ve göz ardı edilebilir karakterler. utf8_general_ci eski bir harmanlamadır bu genişletmeleri desteklemez, kısaltmalar veya göz ardı edilebilir karakterler. Sadece bire bir yapabilir karakterler arasındaki karşılaştırmalar.
Özetlemek gerekirse, utf_general_ci, tüm standardı uygulaması gereken utf_unicode_ci'den daha küçük ve daha az doğru (standarda göre) bir karşılaştırma kümesi kullanır. General_ci kümesi daha hızlı olacaktır çünkü yapılacak daha az hesaplama vardır.