MySQL'de utf8mb4 ve utf8 karakter kümeleri arasındaki fark nedir?


341

MySQLutf8mb4 ile utf8charsets arasındaki fark nedir ?

ASCII , UTF-8 , UTF-16 ve UTF-32 kodlamalarını zaten biliyorum ; ancak MySQL Server'dautf8mb4 tanımlanan diğer kodlama türleriyle kodlama grubunun ne farkını bilmek isterim .

Herhangi bir özel faydaları var mıdır / kullanmanın önermektedir utf8mb4yerine utf8?

Yanıtlar:


392

UTF-8 değişken uzunluklu bir kodlamadır. UTF-8 durumunda bu, bir kod noktasının saklanmasının bir ila dört bayt gerektirdiği anlamına gelir. Ancak, MySQL'in "utf8" ("utf8mb3" diğer adı) adlı kodlaması, kod noktası başına en fazla üç bayt depolar.

Bu nedenle "utf8" / "utf8mb3" karakter kümesi tüm Unicode kod noktalarını saklayamaz: yalnızca " Temel Çok Dilli Düzlem " olarak adlandırılan 0x000 - 0xFFFF aralığını destekler . Ayrıca bkz . Unicode kodlamalarının karşılaştırılması .

MySQL belgelerinin bu konuda (aynı sayfanın önceki bir sürümü) söylediği şey budur:

Utf8 [/ utf8mb3] adlı karakter kümesi, karakter başına maksimum üç bayt kullanır ve yalnızca BMP karakterlerini içerir. MySQL 5.5.3 itibariyle, utf8mb4 karakter seti ek karakterleri destekleyen karakter başına maksimum dört bayt kullanır:

  • Bir BMP karakteri için utf8 [/ utf8mb3] ve utf8mb4 aynı depolama özelliklerine sahiptir: aynı kod değerleri, aynı kodlama, aynı uzunluk.

  • Tamamlayıcı bir karakter için utf8 [/ utf8mb3] karakteri hiç saklayamazken, utf8mb4 onu saklamak için dört bayt gerektirir. Utf8 [/ utf8mb3] karakteri hiç saklayamadığından, utf8 [/ utf8mb3] sütunlarında herhangi bir tamamlayıcı karakteriniz yoktur ve eski sürümlerinden utf8 [/ utf8mb3] verilerini yükseltirken karakterleri dönüştürme veya veri kaybetme konusunda endişelenmenize gerek yoktur MySQL.

Bu nedenle, sütununuzun emoji gibi BMP'nin dışındaki karakterleri depolamasını (ve genellikle yapmak istediğinizi) desteklemesini istiyorsanız , "utf8mb4" kullanın. Ayrıca bkz . Gerçek kullanımda en yaygın BMP olmayan Unicode karakterler nelerdir? .


10
Utf8mb4 'gerekli' olduğu şimdiye kadar karşılaştığım tek vaka Çince ve İfadeler. İhtiyacı olan belirsiz alfabe vardır.
Rick James

10
Şifrelenmiş parolaları ve verileri veritabanınızda tutmak için de kullanmanız gerekir. Bazı şifreleri ile rastgele ve hata ayıklamak için bana çok sorun neden normal utf8 biçimini kullanarak mysql şifreli parola tutuyordu, bu yüzden sonunda base64 kodlamak kullanmaya çalıştım ve geçici sorun düzeltildi. Ama şimdi sebebini biliyorum.
Mojtaba Rezaeian

38
@idealidea şifreli veriler ikiliktir ve ikili verileri bir varchar sütununda saklamamanız gerekir. :)
CodeCaster

8
@thomasrutter UTF-8 ile kaydetmek için bu (𡞰) karakteri deneyin. :)
502_Geek

2
@MojtabaRezaeian bir şekilde şifre algoritmasına bağımlıdır - bcrypt2 ASCII üretecektir.
Jasen


47

Alındığı Manuel MySQL 8.0 Referans :

  • utf8mb4: Karakter başına bir ila dört bayt kullanan Unicode karakter kümesinin UTF-8 kodlaması .

  • utf8mb3: Karakter başına bir ila üç bayt kullanılarak Unicode karakter kümesinin UTF-8 kodlaması .

In MySQL utf8 şu anda için bir takma ad utf8mb3olan kullanımdan kaldırıldı ve gelecekteki kaldırılacaktır MySQL sürümünde. Bu noktada utf8 bir referans haline gelecektir utf8mb4 .

Bu takma addan bağımsız olarak, bilinçli olarak kendinize bir utf8mb4kodlama ayarlayabilirsiniz .

Cevabı tamamlamak için aşağıdaki @ WilliamEntriken'in yorumunu eklemek istiyorum (kılavuzdan da alınmıştır):

Anlamı hakkında belirsizlikten kaçınmak için, karakter kümesi referansları yerine açıkça utf8belirtmeyi düşünün .utf8mb4utf8

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.