Karakter kümesi ve harmanlama tam olarak ne anlama geliyor?


315

MySQL belgelerini okuyabilirim ve oldukça açık. Ancak, hangi karakterin kullanılacağına nasıl karar verilir? Harmanlamanın hangi veriler üzerinde etkisi vardır?

İkisinin ve nasıl seçileceğinin açıklanmasını istiyorum.

Yanıtlar:


511

MySQL belgelerinden :

Bir karakter kümesi sembol ve kodlamaların kümesidir. Bir harmanlama bir karakter kümesindeki karakterleri karşılaştırmak için bir kurallar kümesidir. Hayali bir karakter seti örneği ile ayrımı netleştirelim.

Dört harfli bir alfabemiz olduğunu varsayın: 'A', 'B', 'a', 'b'. Her harfe bir sayı veririz: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. 'A' harfi bir semboldür, 0 rakamı 'A' için kodlamadır ve dört harf ve bunların kodlarının birleşimi bir karakter kümesidir.

Şimdi, 'A' ve 'B' olmak üzere iki dize değerini karşılaştırmak istediğimizi varsayalım. Bunu yapmanın en basit yolu kodlamaya bakmaktır: 'A' için 0 ve 'B' için 1. 0 1'den küçük olduğu için 'A'nın' B'den küçük olduğunu söylüyoruz. Şimdi, az önce yaptığımız karakter setimize bir harmanlama uygulamak. Harmanlama bir kurallar kümesidir (bu durumda yalnızca bir kural): "kodlamaları karşılaştırın." Bunu mümkün olan en basit harmanlamalara ikili harmanlama olarak adlandırıyoruz.

Peki ya küçük ve büyük harflerin eşdeğer olduğunu söylemek istersek? Sonra en az iki kuralımız olur: (1) 'a' ve 'b' küçük harflerini 'A' ve 'B' ile eşdeğer olarak ele alır; (2) daha sonra kodlamaları karşılaştırın. Buna büyük / küçük harfe duyarlı olmayan bir harmanlama diyoruz. İkili bir harmanlamadan biraz daha karmaşıktır.

Gerçek hayatta, çoğu karakter setinin birçok karakteri vardır: sadece 'A' ve 'B' değil, tüm alfabe, bazen birden fazla alfabe veya binlerce karakter içeren doğu yazı sistemleri, birçok özel sembol ve noktalama işareti. Ayrıca gerçek hayatta, çoğu harmanlamanın birçok kuralı vardır: sadece büyük / küçük harf duyarsızlığı değil, aynı zamanda aksan duyarsızlığı ("aksan" bir karaktere Almanca 'ö "' de olduğu gibi eklenmiş bir işarettir) ve çok karakterli eşlemeler (örneğin, ö '=' OE 'iki Alman derlemesinden birinde).


206

Bir karakter kodlama onlar bellekte sığacak böylece kodlamak karakterle bir yoldur. Yani karakter seti ISO-8859-15 ise, euro simgesi € € 0xa4 olarak kodlanacak ve UTF-8'de 0xe282ac olacaktır.

Harmanlama latin9 içinde, harfleri vardır, karakterleri karşılaştırmak için nasıl e é è ê fonların ikili gösterimi göre sınıflandırılmaktadır takdirde, gidecek e f é ê èharmanlama olarak ayarlanırsa, örneğin ancak, Fransızca, düşündüğünden sırayla gerekecek onlar her olan olur e é è êeşittir, ve daha sonra f.


5
Tek bir karakter kümesi için birçok farklı harmanlama olabileceğini belirtmek önemlidir. "Doğru" olan, normalde yazıldığı dile göre belirlenen metnin anlambilimine bağlıdır.
Phil

20

Karakter kümesi, yazılı tüm gliflerin bir alt kümesidir. Karakter kodlaması, bu karakterlerin nasıl sayısal değerlerle eşlendiğini belirtir. UTF-8 ve UTF-16 gibi bazı karakter kodlamaları Evrensel Karakter Kümesindeki herhangi bir karakteri kodlayabilir. US-ASCII veya ISO-8859-1 gibi diğerleri, karakter başına sırasıyla 7 ve 8 bit kullandıkları için yalnızca küçük bir altkümeyi kodlayabilir. Birçok standart hem karakter kümesini hem de karakter kodlamasını belirttiği için, "karakter kümesi" terimi genellikle "karakter kodlaması" yerine serbestçe değiştirilir.

Harmanlama, karakterlerin sıralama için nasıl karşılaştırılabileceğini belirleyen kuralları içerir. Harmanlama kuralları yerel ayara özgü olabilir: iki karakterin uygun sırası dilden dile değişir.

Bir karakter kümesi ve harmanlama seçmek, uygulamanızın uluslararası olup olmadığına bağlıdır. Değilse, hangi yerel ayarı hedefliyorsunuz?

Hangi karakter setini desteklemek istediğinizi seçmek için başvurunuzu dikkate almanız gerekir. Kullanıcı tarafından sağlanan girdileri saklıyorsanız, yazılımınızın sonunda kullanılacağı tüm yerel ayarları önceden tahmin etmek zor olabilir. Hepsini desteklemek için en baştan UCS'yi (Unicode) desteklemek en iyisi olabilir. Ancak bunun bir maliyeti vardır; birçok batı Avrupa karakteri, karakter başına bir yerine iki bayt depolama gerektirecektir.

Veritabanınız bir dizin oluşturmak için harmanlamayı kullanıyor ve daha sonra sıralı sonuçlar sağlamak için bu dizini kullanıyorsa, doğru harmanlamayı seçmek performansa yardımcı olabilir. Ancak, karşılaştırma kuralları genellikle bölgeye özgü olduğundan, sonuçları başka bir yerel ayarın kurallarına göre sıralamanız gerekirse bu dizin değersiz olacaktır.


üzgünüm ahbap Ben sadece acemiyim ve sadece açıklamaya ihtiyacım var. Yani, böyle bir harmanlamayı anlayabilir miyim, her karakterin (latin veya çince olarak) düzgün bir şekilde tanınmasını ve ilgili kodlamaları vermesini sağlar. Bu doğru mu? Cevabınızı umarım
Mirich

1
@Mirich Hayır, harmanlama, karakterlerin nasıl sıralanacağıyla ilgili bilgilerdir. Dünyanın farklı bölgeleri, karakterleri farklı şekillerde sıralamayı tercih eder.
erickson

3

utf8mb4_unicode_ciSıralama ve karşılaştırma için Unicode standardına dayanan, çok çeşitli dillerde doğru şekilde sıralanmanızı öneririm .


3
OP: "Ben ikisinin bir açıklamasını ve nasıl
seçilir

1
@simhumileco, üzgünüm ahbap Sadece acemiyim ve açıklamana ihtiyacım var. Yani, böyle bir harmanlamayı anlayabilir miyim, her karakterin (latin veya çince olarak) düzgün bir şekilde tanınmasını ve ilgili kodlamaları vermesini sağlar. Bu doğru mu? Cevabınızı umarım
Mirich

1
Her şey kullanmak eğer, başka yerlerde kullanmak kodlayan bağlıdır @Mirich UTF-8kullanırsanız veritabanının bir sistem dışına içinde kodlayan, veritabanında sonra her şey de düzgün yazılmalıdır utf8mb4içinde MySQL . O, sıralama karşılaştırılması ve belirli karakterler için metin dönüştürme düzgün çalışması söz konusu olduğunda MySQL , mükemmel bir çözüm bulmak zordur, ama *_unicode_cikesinlikle daha iyi olduğunu *_general, ama aynı zamanda kendi dezavantajları vardır. Lütfen okuyun: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco
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.