Utf8mb4 kullanarak bir VARCHAR (255) alanına UNIQUE dizini eklemeye çalışırken bu sorunla karşılaştık. Sorun burada daha iyi açıklanmış olsa da, bunu nasıl çözdüğümüz ve çözdüğümüze dair pratik öneriler eklemek istedim.
Utf8mb4 kullanıldığında, karakterler 4 bayt olarak sayılırken, utf8 altında 3 bayt olabilir. InnoDB veritabanlarının dizinlerinin yalnızca 767 bayt içerebileceği bir sınırı vardır. Dolayısıyla utf8 kullanırken 255 karakter (767/3 = 255) saklayabilirsiniz, ancak utf8mb4 kullanarak yalnızca 191 karakter (767/4 = 191) depolayabilirsiniz.
VARCHAR(255)
Utf8mb4 kullanan alanlar için kesinlikle normal dizinler ekleyebiliyorsunuz , ancak olan şey, dizin boyutunun otomatik olarak 191 karakterde kesildiği - unique_key
burada olduğu gibi :
Bu iyidir, çünkü düzenli indeksler MySQL'in verilerinizde daha hızlı arama yapmasına yardımcı olmak için kullanılır. Tüm alanın dizine eklenmesi gerekmez.
Öyleyse, MySQL neden dizini normal dizinler için otomatik olarak kesiyor, ancak benzersiz dizinler için yapmaya çalışırken açık bir hata atıyor? MySQL'in eklenen veya güncellenen değerin zaten mevcut olup olmadığını anlayabilmesi için, sadece değerin bir kısmını değil, tüm değeri dizine eklemesi gerekir.
Günün sonunda, bir alanda benzersiz bir dizin oluşturmak istiyorsanız, alanın tüm içeriği dizine sığmalıdır. Utf8mb4 için bu, VARCHAR alan uzunluklarınızı 191 veya daha az karaktere düşürmek anlamına gelir. Bu tablo veya alan için utf8mb4'e ihtiyacınız yoksa, onu utf8'e geri bırakabilir ve 255 uzunluk alanınızı koruyabilirsiniz.