Saat Anda menetapkan UTF-8 untuk suatu kolom di MySQL, mesin secara default menggunakan UTF8MB3—subset Unicode 3-byte yang tidak dapat merepresentasikan emoji atau karakter tambahan lainnya. Migrasi ke UTF8MB4 biasanya memerlukan pembangunan ulang seluruh tabel, yang memblokir operasi tulis dan dapat memakan waktu beberapa menit atau lebih pada set data besar. PolarDB for MySQL memungkinkan Anda mengubah set karakter kolom dari UTF8MB3 ke UTF8MB4 secara instan tanpa perlu membangun ulang tabel atau memblokir DML konkuren.
Prasyarat
Sebelum memulai, pastikan kluster Anda memenuhi salah satu persyaratan versi berikut:
PolarDB for MySQL 8.0.1, versi revisi 8.0.1.1.40 atau lebih baru. Untuk memeriksa versi revisi Anda, lihat bagian Query the engine version dalam "Engine versions."
CatatanPada kluster 8.0.1, Anda harus mengaktifkan parameter
loose_innodb_support_instant_modify_charsetsebelum menggunakan fitur ini. Lihat Change the character set untuk instruksi lengkapnya.PolarDB for MySQL 8.0.2. Fitur ini diaktifkan secara default dan tidak memerlukan konfigurasi tambahan.
Batasan
Perubahan set karakter instan hanya berlaku jika semua kondisi berikut terpenuhi.
Tipe data yang didukung
Kolom harus memiliki salah satu tipe data berikut: CHAR, VARCHAR, ENUM, atau TEXT.
Konversi yang didukung
UTF8MB3 → UTF8MB4
Tipe karakter apa pun → BINARY
Tidak ada indeks pada kolom
Kolom tidak boleh memiliki indeks.
Batas panjang penyimpanan
Kedua ketentuan berikut harus dipenuhi:
Panjang penyimpanan maksimum sebelum dan sesudah perubahan harus berada di sisi yang sama dari batas 256 byte—keduanya di bawah 256 byte atau keduanya 256 byte atau lebih.
Panjang penyimpanan maksimum setelah perubahan tidak boleh lebih kecil daripada sebelum perubahan.
Panjang penyimpanan dihitung sebagai: panjang kolom × byte per karakter. UTF8MB3 menggunakan hingga 3 byte per karakter; UTF8MB4 menggunakan hingga 4 byte per karakter; BINARY menggunakan 1 byte per karakter.
Contoh
| Definisi kolom | Sebelum perubahan | Sesudah perubahan | Instan? | Alasan |
|---|---|---|---|---|
VARCHAR(85) UTF8MB3 → UTF8MB4 | 85 × 3 = 255 byte | 85 × 4 = 340 byte | Tidak | Melewati batas 256 byte (255 → 340) |
CHAR(120) UTF8MB3 → BINARY | 120 × 3 = 360 byte | 120 × 1 = 120 byte | Tidak | Panjang setelah perubahan lebih kecil daripada sebelumnya |
VARCHAR(60) UTF8MB3 → UTF8MB4 | 60 × 3 = 180 byte | 60 × 4 = 240 byte | Ya | Keduanya di bawah 256 byte; sesudah ≥ sebelum |
Mengubah set karakter
Langkah 1: Aktifkan parameter (hanya untuk kluster 8.0.1)
Pada PolarDB for MySQL 8.0.1, atur parameter loose_innodb_support_instant_modify_charset ke ON sebelum menjalankan pernyataan ALTER TABLE apa pun.
| Parameter | Tingkat | Default | Deskripsi |
|---|---|---|---|
loose_innodb_support_instant_modify_charset | Global | OFF | Mengaktifkan perubahan set karakter instan. Atur ke ON untuk menggunakan fitur ini. |
Untuk instruksi tentang pengaturan parameter kluster, lihat Configure cluster and node parameters.
Pada PolarDB for MySQL 8.0.2, lewati langkah ini.
Langkah 2: Jalankan ALTER TABLE
Gunakan ALGORITHM=INPLACE untuk secara eksplisit memicu perubahan instan:
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4, ALGORITHM = INPLACE;Untuk membiarkan PolarDB memilih algoritma tercepat yang tersedia secara otomatis, hilangkan klausa ALGORITHM atau atur ke DEFAULT:
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4, ALGORITHM = DEFAULT;
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4;Saat Anda menggunakan ALGORITHM=DEFAULT, PolarDB akan memilih INPLACE jika perubahan instan memungkinkan, dan beralih ke COPY jika tidak.
Jika INPLACE gagal
Jika kolom tidak memenuhi batasan, pernyataan tersebut akan mengembalikan:
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.Periksa apakah loose_innodb_support_instant_modify_charset telah diatur ke ON (untuk kluster 8.0.1) dan pastikan kolom memenuhi semua kondisi dalam Batasan.
Perbandingan performa
Contoh berikut membandingkan waktu eksekusi pada dua tabel (t1 dan t2) dengan struktur identik, masing-masing berisi 10 juta baris. Kedua tabel mengubah set karakter kolom dari UTF8MB3 ke UTF8MB4.
Tanpa perubahan instan — mesin membangun ulang seluruh tabel:
ALTER TABLE t1 MODIFY COLUMN c varchar(2) CHARACTER SET utf8mb4 NOT NULL DEFAULT '';Query OK, 10000000 rows affected (59.66 sec)
Records: 10000000 Duplicates: 0 Warnings: 0Operasi ini memakan waktu sekitar 1 menit dan hanya operasi kueri yang dapat dilakukan selama seluruh proses DDL.
Dengan perubahan instan — hanya metadata yang diperbarui:
ALTER TABLE t2 MODIFY COLUMN c varchar(2) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',ALGORITHM = INPLACE;Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0Operasi ini selesai dalam 0,03 detik, terlepas dari ukuran tabel.
Langkah selanjutnya
Contact us jika Anda memiliki pertanyaan tentang operasi DDL
Contact us
Jika Anda memiliki pertanyaan tentang operasi DDL, silakan contact technical support.