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ı.
Operasyonel Doğrulama & Güvenilirlik Standardı
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
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.
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ı
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
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:
SET NAMES utf8mb4;- •JDBC (Java):
characterEncoding=UTF-8&connectionCollation=utf8mb4_0900_ai_ci - •Node.js / TypeORM / Prisma:
charset: "utf8mb4" - •PHP PDO:
charset=utf8mb4DSN 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ı)
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:
[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.
- •İlişkili Hata (İndeks Sınırı): MySQL Error 1071: Specified key was too long
- •Veritabanı Hub: MySQL Üretim Mimarisi Rehberi
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
MySQL ERROR 1045 Access denied: root Şifresi Sıfırlama Rehberi
MySQL 1045 hatasının dört nedeni, "using password: YES/NO" ayrımının anlamı ve kilitli kalınca --init-file ile güvenli şifre sıfırlama.
MySQL Deadlock ERROR 1213: Grafiği Okuma ve Kalıcı Önleme
MySQL 1213 deadlock hatasının nedeni, LATEST DETECTED DEADLOCK çıktısını okuma, gap lock kaynaklı kilitlenmeler ve uygulama tarafında retry tasarımı.
MySQL Lock wait timeout exceeded: Bloklayan İşlemi Bulma
1205 lock wait timeout hatasında bloklayan işlemi performance_schema ile bulma, KILL kararını verme ve kilidi kalıcı olarak azaltma yöntemleri.