𝗠𝗮𝗴𝗲𝗻𝘁𝗼 𝟮'𝘆𝗶 𝘂𝘁𝗳𝟴'𝗱𝗲𝗻 𝘂𝘁𝗳𝟴𝗺𝗯𝟰'𝗲 𝗧𝗮𝘀ı𝗺𝗮𝗸
Bir müşteri isminde emoji kullandı. Veritabanı, ismi emojiden hemen sonra kesti. Loglarda herhangi bir hata görünmedi.
Sorun MySQL utf8'dir. Bu gerçek bir UTF-8 değildir. Üç baytlık bir sınıra sahiptir.
Emojiler ve birçok modern sembol dört bayta ihtiyaç duyar. Eğer eski utf8'i kullanırsanız, MySQL verinizi kırpar. SQL modunuz strict değilse bu durum sessizce gerçekleşir. Farkında bile olmadan veri kaybedersiniz.
Çözüm utf8mb4'tür. Karakter başına dört baytı destekler.
Büyük bir Magento mağazasında basitçe bir dönüştürme komutu çalıştıramazsınız. Muhtemelen bir hatayla karşılaşırsınız. Hata, anahtarınızın (key) çok uzun olduğunu söyleyecektir.
Bu durum, MySQL'in indeks boyutunu mümkün olan maksimum bayt sayısına göre hesaplamasından kaynaklanır. utf8'de bir VARCHAR(255) sütunu 765 bayt kullanır. utf8mb4'te ise aynı sütun 1020 bayta ihtiyaç duyar. Bu da eski 767 baytlık sınırı aşar.
Bu nasıl düzeltilir:
- innodb_large_prefix özelliği etkinleştirilmiş MySQL 8.0 veya MySQL 5.7 kullanın. Bu, sınırınızı 3072 bayta çıkarır.
- Eğer eski bir sunucu kullanıyorsanız, indekslenen VARCHAR sütunlarını 191 karaktere düşürün. 191 karakter çarpı 4 bayt, 764 bayt eder. Bu, sınıra uygundur.
Başarılı bir taşıma işlemi üç adım gerektirir:
- Veritabanını ve tabloları güncelleyin. Mevcut verileri yeniden yazan ALTER TABLE CONVERT TO CHARACTER SET utf8mb4 komutunu kullanın.
- my.cnf dosyanızdaki sunucu varsayılanlarını güncelleyin. Bu, yeni tabloların doğru ayarları kullanmasını sağlar.
- Uygulama bağlantı karakter setini (charset) güncelleyin. Bağlantı utf8 olarak kalırsa, veriler veritabanına ulaşmadan bozulacaktır.
Şu risklere dikkat edin:
- Tablo kilitlenmeleri (Table locks). CONVERT TO tüm tabloyu yeniden yazar. Büyük tablolar kilitlenecektir. Mağazanızın çevrimiçi kalmasını sağlamak için pt-online-schema-change gibi araçlar kullanın.
- Collation uyumsuzlukları. Birleştirilen (join edilen) tüm tablolar aynı collation'ı kullanmalıdır. Tüm şemanızda utf8mb4_unicode_ci kullanın.
Eğer hala utf8 kullanıyorsanız, mağazanız Unicode açısından güvenli değildir. Sadece yanlış bir karakterin verilerinizi bozmasını bekliyorsunuz demektir.
