𝗠𝗶𝗴𝗿𝗮𝘁𝗶𝗻𝗴 𝗠𝗮𝗴𝗲𝗻𝘁𝗼 𝟮 𝗳𝗿𝗼𝗺 𝘂𝘁𝗳𝟴 𝘁𝗼 𝘂𝘁𝗳𝟴𝗺𝗯𝟰

Seorang pelanggan menggunakan emoji pada namanya. Database memotong nama tersebut tepat setelah emoji. Tidak ada kesalahan yang muncul di log.

Masalahnya adalah MySQL utf8. Itu bukan UTF-8 yang sebenarnya. Itu memiliki batasan tiga byte.

Emoji dan banyak simbol modern membutuhkan empat byte. Jika Anda menggunakan utf8 lama, MySQL akan memotong data Anda. Hal ini terjadi secara diam-diam jika mode SQL Anda tidak strict. Anda kehilangan data tanpa menyadarinya.

Solusinya adalah utf8mb4. Ini mendukung empat byte per karakter.

Anda tidak bisa begitu saja menjalankan perintah konversi pada toko Magento yang besar. Anda kemungkinan besar akan menemui error. Error tersebut menyatakan bahwa key Anda terlalu panjang.

Ini terjadi karena MySQL menghitung ukuran indeks berdasarkan jumlah byte maksimum yang memungkinkan. Kolom VARCHAR(255) menggunakan 765 byte dalam utf8. Dalam utf8mb4, kolom yang sama membutuhkan 1020 byte. Ini melebihi batasan 767-byte yang lama.

Cara memperbaikinya:

  • Gunakan MySQL 8.0 atau MySQL 5.7 dengan innodb_large_prefix yang diaktifkan. Ini meningkatkan batasan Anda menjadi 3072 byte.
  • Jika Anda menggunakan server lama, kurangi kolom VARCHAR yang diindeks menjadi 191 karakter. 191 karakter dikali 4 byte sama dengan 764 byte. Ini sesuai dengan batasan tersebut.

Migrasi yang berhasil memerlukan tiga langkah:

  1. Perbarui database dan tabel. Gunakan ALTER TABLE CONVERT TO CHARACTER SET utf8mb4. Ini akan menulis ulang data yang ada.
  2. Perbarui pengaturan default server di file my.cnf Anda. Ini memastikan tabel baru menggunakan pengaturan yang benar.
  3. Perbarui charset koneksi aplikasi. Jika koneksi tetap menggunakan utf8, data akan rusak sebelum mencapai database.

Waspadai risiko-risiko berikut:

  • Table locks. CONVERT TO menulis ulang seluruh tabel. Tabel yang besar akan terkunci. Gunakan alat seperti pt-online-schema-change agar toko Anda tetap online.
  • Collation mismatches. Semua tabel yang digabungkan harus menggunakan collation yang sama. Gunakan utf8mb4_unicode_ci di seluruh skema Anda.

Jika Anda masih menggunakan utf8, toko Anda tidak aman Unicode. Anda hanya sedang menunggu karakter yang salah merusak data Anda.

Sumber: https://dev.to/iamrobindhiman/migrating-a-magento-2-store-from-utf8-to-utf8mb4-without-losing-data-khn