dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/mysql-incorrect-string-value-utf8mb4
MySQL
MySQL 8.4 LTS / 9.7 LTSKarakter Seti & Collation
6 dk okuma
ERROR 1366 (HY000): Incorrect string value

MySQL "Incorrect string value" — Emoji Neden Kaydedilmiyor?

Emoji kaydederken çıkan "Incorrect string value: '\xF0\x9F\x98\x80'" hatasının nedeni, tablo/kolon dönüşümü ve bağlantı karakter seti ayarları.

İnceleyen:Principal Database Reliability Architect
Test Edilen Sürümler: MySQL 9.7.4 LTS & 8.4.13 LTS (Debian / Docker) | Tarihsel: MySQL 8.0, 5.7

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 29 Ekim 2026
Test Edilen SürümlerMySQL 9.7.4 LTS & 8.4.13 LTS | Tarihsel: MySQL 8.0.36, 5.7.44
Gerekli YetkiALTER TABLE ve SET NAMES çalıştırma yetkisi
Risk Seviyesi
MediumALTER TABLE CONVERT TO işlemi tabloyu kilitler ve diskte geçici kopya alanı gerektirir
Beklenen Çıktıutf8mb4_0900_ai_ci collation altında 4 baytlık emoji karakterlerinin hatasız saklanması
Geri Dönüş (Rollback) Planı:Yedekten geri dönme veya pt-online-schema-change geri alma adımları
MySQL 8.4 Reference Manual: The utf8mb4 Character Set
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

plaintext
ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x80' for column 'yorum' at row 1

\xF0\x9F\x98\x80 bayt dizisi 😀 emojisinin UTF-8 karşılığıdır: 4 baytlık bir karakter. Hata, hedeflenen tablonun veya kolonun utf8mb3 (eski adıyla utf8) karakter setinde tanımlanmış olmasından kaynaklanır; bu küme en fazla 3 baytlık karakterleri kabul eder.

UYARI
MySQL İsimlendirme Yanılgısı: MySQL ekosistemindeki utf8 gerçek UTF-8 değildir; UTF-8 standardının 3 baytla budanmış halidir (utf8mb3). Tam UTF-8 desteği için `utf8mb4` zorunludur.

▸Nedeni Doğrulayan Teşhis Sorguları

sql
SELECT @@character_set_server, @@collation_server, @@character_set_client; SELECT table_name, table_collation FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'yorumlar'; SELECT column_name, character_set_name, collation_name FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'yorumlar' AND character_set_name IS NOT NULL;

▸Adım Adım Çözüm

1. Tabloyu ve Kolonları utf8mb4'e Dönüştürün

sql
ALTER TABLE yorumlar CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

utf8mb4_0900_ai_ci, MySQL 8.0 ve üzeri için varsayılandır. Eski MySQL 5.7 uyumluluğu gerekiyorsa utf8mb4_unicode_ci tercih edin.

2. Bağlantı ve İstemci Karakter Setini Yapılandırın

Tablo dönüştürülse bile istemci bağlantısı utf8mb3 konuşuyorsa hata sürer:

sql
SET NAMES utf8mb4;
  • •JDBC (Java): characterEncoding=UTF-8&connectionCollation=utf8mb4_0900_ai_ci
  • •Node.js / TypeORM / Prisma: charset: "utf8mb4"
  • •PHP PDO: charset=utf8mb4 DSN parametresi.

3. Büyük Tablolarda Çevrimiçi Dönüşüm (Online DDL)

CONVERT TO CHARACTER SET tablonun tam bir kopyasını çıkarır ve yazma kilitlerine yol açar. Yüksek hacimli tablolarda pt-online-schema-change veya gh-ost kullanın.

4. Kritik Kontrol: İndeksleri Yeniden Hesaplayın (H-22 Bağlantısı)

DİKKAT / TEHLİKE
İndeks Sınırı Uyarısı: utf8mb4'te karakter başına 4 bayt hesaplandığı için, utf8mb3 altında sınırda çalışan indeksler dönüşüm sonrasında MySQL Error 1071: Specified key was too long hatası vererek tablonun yeniden oluşturulmasını engelleyebilir! Dönüşüm öncesi indeks uzunluklarını denetleyin.

▸Bunu Bir Daha Yaşamamak İçin

Sunucu konfigürasyonunda (my.cnf) genel varsayılanları sabitleyin:

ini
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_0900_ai_ci

Şema tanımlarından utf8 kelimesini tamamen çıkarın; her zaman açıkça utf8mb4 kullanın.

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (50)