Jika Anda menentukan set karakter UTF-8 untuk sebuah kolom di MySQL, secara default set karakter UTF8MB3 digunakan. Set karakter ini menggunakan hingga tiga byte untuk menyimpan setiap karakter. Untuk menyimpan informasi seperti emoji, Anda harus mengubah set karakter kolom menjadi UTF8MB4. Biasanya, perubahan ini memerlukan pembangunan ulang seluruh tabel, yang memakan waktu dan berdampak signifikan pada bisnis Anda. PolarDB for MySQL memungkinkan Anda mengubah set karakter kolom secara instan tanpa memengaruhi operasional bisnis.
Prasyarat
Kluster Anda harus memenuhi salah satu dari persyaratan versi berikut:
Kluster PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.40 atau lebih baru. Untuk melihat versi kluster Anda, lihat bagian Memeriksa versi engine dalam topik "Versi engine".
CatatanUntuk menggunakan fitur ini di kluster PolarDB for MySQL 8.0.1, Anda harus terlebih dahulu mengonfigurasi parameter
loose_innodb_support_instant_modify_charset.PolarDB for MySQL 8.0.2.
CatatanFitur ini tersedia out-of-the-box pada kluster PolarDB for MySQL 8.0.2 tanpa konfigurasi tambahan.
Batasan
Anda hanya dapat mengubah set karakter untuk kolom bertipe data CHAR, VARCHAR, ENUM, atau TEXT.
Anda hanya dapat mengubah set karakter kolom dari UTF8MB3 ke UTF8MB4 atau mengubah tipe data kolom dari tipe acuan ke BINARY.
Tidak ada indeks yang dibuat pada kolom yang set karakternya akan diubah.
Panjang kolom yang set karakternya akan diubah harus memenuhi persyaratan berikut:
Sebelum dan sesudah mengubah set karakter kolom, panjang penyimpanan maksimum kolom harus kurang dari 256 byte atau lebih dari 255 byte. Panjang penyimpanan adalah jumlah byte yang sebenarnya ditempati oleh set karakter.
Contohnya, jika kolom bertipe data VARCHAR(85) menggunakan set karakter UTF8MB3, panjang penyimpanan maksimum kolom dihitung sebagai berikut:
85 × 3 = 255byte karena set karakter UTF8MB3 menggunakan hingga tiga byte per karakter. Jika set karakter kolom diubah menjadi UTF8MB4, panjang penyimpanan maksimum kolom dihitung sebagai berikut:85 × 4 = 340byte. Karena panjang penyimpanan maksimum setelah perubahan lebih besar dari 256 byte, set karakter kolom tidak dapat diubah secara instan.Panjang penyimpanan maksimum kolom setelah perubahan tidak boleh lebih kecil dari sebelum perubahan.
Contohnya, jika kolom bertipe data CHAR(120) menggunakan set karakter UTF8MB3, panjang penyimpanan maksimum kolom dihitung sebagai berikut:
120 × 3 = 360byte. Jika Anda mengubah tipe data kolom menjadi BINARY, panjang penyimpanan maksimum kolom dihitung sebagai berikut:120 × 1 = 120byte. Dalam hal ini, set karakter kolom tidak dapat diubah secara instan.
Menggunakan fitur untuk mengubah set karakter kolom secara instan
Mengonfigurasi parameter.
Untuk kluster PolarDB for MySQL 8.0.1, Anda harus menyetel parameter
loose_innodb_support_instant_modify_charsetke ON untuk mengaktifkan fitur. Informasi lebih lanjut tentang cara mengonfigurasi parameter dapat ditemukan di Mengonfigurasi parameter kluster dan node.Parameter
Tingkat
Deskripsi
loose_innodb_support_instant_modify_charset
Global
Menentukan apakah akan mengaktifkan fitur untuk mengubah set karakter kolom secara instan. Nilai default: OFF. Nilai valid:
OFF
ON
Menjalankan pernyataan.
Tetapkan parameter ALGORITHM ke INPLACE untuk memaksa penggunaan fitur perubahan set karakter kolom secara instan. Contoh:
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4, ALGORITHM = INPLACE;Jika algoritma INPLACE tidak tersedia, pesan berikut dikembalikan. Dalam hal ini, pastikan bahwa parameter
loose_innodb_support_instant_modify_charsetdisetel ke ON dan periksa aturan yang dijelaskan dalam bagian "Batasan" dari topik ini.ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.Jika Anda menetapkan parameter ALGORITHM ke DEFAULT atau tidak menentukan parameter ALGORITHM, PolarDB memilih algoritma tercepat untuk mengubah set karakter kolom. Contoh:
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;
Menampilkan hasil eksekusi
Dalam contoh ini, dua tabel bernama t1 dan t2 digunakan, masing-masing berisi 10 juta baris data. Set karakter kolom diubah dari UTF8MB3 ke UTF8MB4 ketika fitur untuk mengubah set karakter kolom secara instan diaktifkan dan dinonaktifkan. Tabel t1 dan t2 memiliki struktur dan ukuran data yang sama.
Ketika fitur dinonaktifkan, seluruh tabel harus dibangun ulang untuk mengubah set karakter kolom. Proses ini membutuhkan sekitar 1 menit untuk membuat ulang tabel dan hanya operasi kueri yang dapat dilakukan selama proses DDL sepenuhnya.
ALTER TABLE t1 MODIFY COLUMN c varchar(2) CHARACTER SET utf8mb4 NOT NULL DEFAULT '';Hasil sampel:
Query OK, 10000000 rows affected (59.66 sec) Records: 10000000 Duplicates: 0 Warnings: 0Ketika fitur diaktifkan, Anda dapat mengubah set karakter kolom secara instan terlepas dari ukuran data tabel.
ALTER TABLE t2 MODIFY COLUMN c varchar(2) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',ALGORITHM = INPLACE;Hasil sampel:
Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0
Hubungi kami
Jika Anda memiliki pertanyaan tentang operasi DDL, hubungi kami.