MySQL’de utf8 ve utf8mb4 Arasındaki Fark Nedir?

Karakter kodlaması, verilerin modern uygulamalarda nasıl saklandığı, sorgulandığı ve görüntülendiği konusunda temeldir ve barındırma ortamları için de geçerlidir. Eğer bir paylaşımlı barındırma, VPS veya MySQL veya MariaDB ile güçlendirilmiş bir dedike sunucu üzerinde bir web sitesi veya web uygulaması çalıştırıyorsanız, muhtemelen utf8 ve utf8mb4 terimleriyle karşılaşmışsınızdır. İlk bakışta, her ikisi de Unicode kodlamalarını temsil ettiği için eş anlamlı gibi görünmektedir. Ancak, arka planda, modern metin verilerini, örneğin emojileri, çok dilli içerikleri veya belirli CJK (Çince, Japonca, Korece) karakterlerini saklama yeteneğinizi etkileyebilecek kritik bir ayrım vardır—özellikle uluslararasılaştırılmış veya çok dilli barındırma çözümleri için.

Tanımlar

utf8

  • MySQL’in eski Unicode kodlaması.

  • Sadece her karakter için 3 bayt destekler.

  • Karakterleri Temel Çok Dilli Düzlem (BMP) içinde saklayabilir: U+0000 ile U+FFFF arasında.

  • Emojileri, müzik sembollerini, belirli Çince karakterleri ve diğer tamamlayıcı karakterleri saklayamaz.

utf8mb4 (Çok Baytlı 4)

  • Gerçek UTF-8 uygulaması.

  • Tam Unicode desteği, BMP dışındaki karakterler dahil.

  • Her karakter için 4 bayta kadar kullanır—UTF-8’in tasarlandığı gibi.

  • Emojileri (😊), nadir Çince karakterleri (𠀋) veya matematik sembollerini (𝛑) saklamak için gereklidir.

MySQL’deki Yanıltıcı utf8

MySQL’de utf8 karakter seti, UTF-8 standardının tam bir uygulaması değildir. Bu, 3 bayt ile sınırlıdır, oysa standart UTF-8 4 bayta kadar kullanır. Bu, demektir ki:

  • MySQL’deki utf8 gerçek UTF-8 değildir.

  • U+FFFF’in ötesindeki kod noktalarını dışlayan bir alt küme gibidir.

Buna karşılık, utf8mb4 UTF-8 standardına tamamen uyar.

Teknik Karşılaştırma

Özellikutf8utf8mb4
Karakter başına maksimum bayt34
Unicode kapsamıU+FFFF’e kadar (sadece BMP)Tam aralık (U+10FFFF’e kadar)
Emoji desteği❌ Hayır✅ Evet
Tamamlayıcı karakter desteği❌ Hayır✅ Evet
MySQL uyumluluğu✅ Eski sürüm uyumlu✅ Tam Unicode
Sıralama seçenekleriSınırlıDaha kapsamlı (örneğin, utf8mb4_0900_ai_ci)

Neden utf8mb4 Doğru Seçimdir

1. Emoji ve Modern Sembol Desteği

MySQL’in utf8’i ile 🐱, 🧠, 🚀 veya 🇩🇪 saklayamazsınız. Bunlar BMP dışındadır.

2. Daha İyi Sıralama ve Sıralama

utf8mb4, aşağıdaki gibi daha yeni sıralama seçeneklerini destekler:

  • utf8mb4_unicode_ci: Unicode standart sıralaması

  • utf8mb4_general_ci: Hızlı ama daha az doğru

  • utf8mb4_0900_ai_ci: Modern Unicode 9.0 uyumlu sıralama (MySQL 8+’de mevcut)

3. Geleceğe Hazırlık

Unicode genişledikçe, daha yeni karakterler 3 baytlık aralığın dışına çıkacaktır. utf8mb4, gelecekteki sembollerden mahrum kalmadığınızdan emin olmanızı sağlar.

utf8 Kullandığınızda Ne Olur?

Bir sütuna 4 baytlık bir karakter (bir emoji gibi) eklemeye çalışırsanız, bu hatayı alırsınız:

ERROR 1366 (HY000): Incorrect string value: 'xF0x9Fx98x81' for column 'title' at row 1

Daha kötüsü, uygulamanız düzgün bir şekilde doğrulanmadıysa verileri kısaltabilir veya bozabilir.

utf8’den utf8mb4’e Geçiş

Şemanızı güvenli bir şekilde taşımak için:

Adım 1: Tablo ve sütun tanımlarını güncelleyin

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Adım 2: Veritabanı varsayılarını güncelleyin

ALTER DATABASE my_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Adım 3: Uygulama bağlantı ayarlarını güncelleyin

Uygulamanızın utf8mb4 kullanarak bağlandığından emin olun:

SET NAMES utf8mb4;

En İyi Uygulamalar

  • Yeni veritabanları için her zaman utf8mb4 kullanın.

  • ✅ Doğruluk için utf8mb4_unicode_ci veya performans için utf8mb4_general_ci kullanın.

  • ✅ Tablo ve veritabanı seviyelerinde varsayılan karakter setini ayarlayın.

  • ✅ Uygulama katmanı kütüphanelerinin (örneğin, PDO, MySQLi, Sequelize) utf8mb4’ü desteklediğinden emin olun.

Sonuç

MySQL’deki utf8 ve utf8mb4 arasındaki fark sadece bir bayt değil—modern Unicode uyumluluğu ile sessiz bir başarısızlık arasındaki farktır. utf8 geriye dönük uyumlu kalmaya devam etse de, birçok modern kullanım durumu için kullanımdan kaldırılmıştır. Uygulamanızı geleceğe hazırlamak ve tam çok dilli, emoji ve özel sembol desteği sağlamak için her zaman utf8mb4’ü tercih edin.