- Ada batasan ukuran INDEX. Anda menabrak batas karena utf8mb4 membutuhkan hingga 4 byte per karakter , sedangkan utf8 hanya membutuhkan 3. Sedangkan batas ukuran INDEX dalam byte .
'Solusinya' adalah memutuskan apa yang harus dilakukan tentang indeks yang terlalu besar. (selengkapnya di bawah)
2.
ALTER TABLE t CHANGE col col ...
sama dengan yang lebih logis
ALTER TABLE t MODIFY col ...
Yang pertama memungkinkan Anda untuk mengubah nama kolom, maka dua salinan nama kolom saat Anda tidak perlu mengubah nama.
-
Kemungkinan besar Anda memiliki
VARCHAR(255)
yang membutuhkan 767 byte dalam utf8 (3*255+2; "2" adalah ukuran bidang panjang). Setara dengan utf8mb4 4-byte adalah (191) (4*191+2=766; bukan ruang untuk lebih dari 191). -
Saya belum melihat artikel tentang itu. Saya menduga bahwa apa yang baru saja saya katakan adalah yang paling perlu dikatakan.
Jadi...
Rencanakan A :Apakah Anda memiliki foo VARCHAR(255)
dan itu utf8? Apakah data di dalamnya selalu (sekarang dan di masa mendatang) lebih pendek dari 191 karakter? Jika demikian, maka lakukan saja ALTER.
Rencana B :Jika Anda membutuhkan lebih dari 191, apakah Anda benar-benar membutuhkan INDEX? DROP INDEX dapat menjadi alternatif.
Rencanakan C :Atau, Anda dapat menggunakan indeks "awalan":INDEX(foo(191))
, sambil membiarkannya VARCHAR(255)
. Biasanya indeks "awalan" tidak berguna, tetapi Anda mungkin memiliki kasus penggunaan yang berfungsi.
Untuk membahas ini lebih lanjut, berikan SHOW CREATE TABLE
untuk tabel yang dimaksud, dan diskusikan arti dari bidang tertentu dan INDEKSnya.