Kami mengalami masalah ini ketika mencoba menambahkan indeks UNIQUE ke bidang VARCHAR (255) menggunakan utf8mb4. Sementara masalahnya sudah diuraikan dengan baik di sini, saya ingin menambahkan beberapa saran praktis tentang cara kami memecahkan masalah ini dan menyelesaikannya.
Saat menggunakan utf8mb4, karakter dihitung sebagai 4 byte, sedangkan di bawah utf8, mereka dapat sebagai 3 byte. Database InnoDB memiliki batas bahwa indeks hanya dapat berisi 767 byte. Jadi ketika menggunakan utf8, Anda dapat menyimpan 255 karakter (767/3 = 255), tetapi menggunakan utf8mb4, Anda hanya dapat menyimpan 191 karakter (767/4 = 191).
Anda benar-benar dapat menambahkan indeks reguler untuk VARCHAR(255)
bidang menggunakan utf8mb4, tetapi yang terjadi adalah ukuran indeks dipotong pada 191 karakter secara otomatis - seperti di unique_key
sini:
Ini bagus, karena indeks reguler hanya digunakan untuk membantu pencarian MySQL melalui data Anda lebih cepat. Seluruh bidang tidak perlu diindeks.
Jadi, mengapa MySQL memotong indeks secara otomatis untuk indeks reguler, tetapi melemparkan kesalahan eksplisit ketika mencoba melakukannya untuk indeks unik? Nah, agar MySQL dapat mengetahui apakah nilai yang dimasukkan atau diperbarui sudah ada, perlu benar-benar mengindeks seluruh nilai dan bukan hanya sebagian saja.
Pada akhir hari, jika Anda ingin memiliki indeks unik pada suatu bidang, seluruh isi bidang harus sesuai dengan indeks. Untuk utf8mb4, ini berarti mengurangi panjang bidang VARCHAR Anda menjadi 191 karakter atau kurang. Jika Anda tidak membutuhkan utf8mb4 untuk tabel atau bidang itu, Anda bisa mengembalikannya ke utf8 dan dapat mempertahankan bidang 255 panjang Anda.