Tiga tempat MySQL membutuhkan encoding
- Kolom atau tabel: charset tempat data disimpan, misalnya
utf8mb4ataulatin1. - Koneksi: charset yang dipakai klien dan server saat berkomunikasi, diatur dengan
SET NAMES utf8mb4atau di pengaturan koneksi. - File: encoding untuk membaca impor atau menulis ekspor, di phpMyAdmin pada bagian Set karakter file.
Kalau ketiganya tidak cocok, karakter menjadi rusak. Kasus terbanyak: teks UTF-8 ditulis lewat koneksi latin1 ke kolom latin1. Aplikasi tampak normal, tetapi phpMyAdmin dan hasil ekspor menampilkan é.
Sebelum
"1","Café Müller – Jl. Merdeka No. 12","Rp 25.000 ≈ €1,50","Zürich ’24"
Sesudah
"1","Café Müller – Jl. Merdeka No. 12","Rp 25.000 ≈ €1,50","Zürich ’24"
Memeriksa charset
SHOW VARIABLES LIKE 'character_set%';menampilkan pengaturan server dan koneksi.SHOW CREATE TABLE pelanggan;menampilkan charset tabel beserta kolomnya.SELECT nama, HEX(nama) FROM pelanggan LIMIT 5;menampilkan byte aslinya: di kolomutf8mb4,C3A9adalahé, sedangkanC383C2A9adalahéyang sudah rusak.
Memperbaiki ekspor atau dump
- Ekspor tabel di phpMyAdmin sebagai SQL atau CSV, atau dengan
mysqldump --default-character-set=utf8mb4. - Seret file ke kotak di atas. Mojibuster hanya memperbaiki bagian yang rusak; karakter yang sudah benar tidak diubah.
- Periksa bagian yang diperbaiki di Apa yang berubah? lalu unduh filenya.
- Impor ke tabel
utf8mb4dan pilihutf-8sebagai set karakter di dialog impor. - Uji dulu pada salinan sebelum mengganti tabel yang asli.
Hasil ekspor tidak pernah keluar dari komputer Anda, penting untuk data pelanggan. Kalau teksnya sudah terenkode dua kali, baca juga à pengganti huruf beraksen.
Mengatasi penyebabnya
- Buat tabel baru dengan
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci. - Atur koneksi aplikasi ke
utf8mb4, di PHP misalnya dengancharset=utf8mb4pada DSN PDO. - Kalau byte UTF-8 tersimpan di kolom
latin1, jangan langsung ubah denganCONVERT TO: byte itu akan terenkode untuk kedua kalinya. Jalur aman lewat tipe biner: pertamaMODIFY nama VARBINARY(255), laluMODIFY nama VARCHAR(255) CHARACTER SET utf8mb4. - Kalau MySQL mengganti karakter dengan
?, kolom atau koneksi tidak bisa menyimpannya. Data yang sudah tersimpan seperti itu hilang: lihat tanda tanya pengganti huruf.
Pertanyaan yang sering diajukan
Kenapa di aplikasi semuanya normal tetapi di phpMyAdmin tidak?
Karena aplikasi dan database melakukan kesalahan yang sama dua kali: aplikasi menulis UTF-8 lewat koneksi latin1 dan membacanya dengan cara yang sama. phpMyAdmin terhubung dengan benar sehingga menampilkan isi yang sebenarnya. Kalau kesalahannya sudah ada di ekspor WordPress, baca juga WordPress & database dan teks terkodekan ganda.
Collation mana yang sebaiknya dipakai?
utf8mb4_unicode_ci cocok untuk kebanyakan aplikasi; sejak MySQL 8 defaultnya utf8mb4_0900_ai_ci. Charset utf8mb4 lebih penting, bukan utf8, yang di MySQL tidak bisa menyimpan emoji.
Apakah ini juga berlaku untuk MariaDB?
Ya. MariaDB menangani charset seperti MySQL dan perintahnya sama.
Seberapa besar dump yang bisa diproses?
Sampai 100 MB per file. Ekspor database yang lebih besar tabel demi tabel.