Melakukan encoding dengan benar sangat sulit - ada terlalu banyak lapisan:
- Browser
- Halaman
- PHP
- MySQL
Perintah SQL "SET CHARSET utf8" dari PHP akan memastikan bahwa sisi klien (PHP) akan mendapatkan data di utf8, tidak peduli bagaimana mereka disimpan dalam database. Tentu saja, mereka perlu disimpan dengan benar terlebih dahulu.
Definisi DDL vs. data nyata
Pengkodean yang ditentukan untuk tabel / kolom tidak berarti bahwa data berada dalam pengkodean itu. Jika Anda kebetulan memiliki tabel yang didefinisikan sebagai utf8
tetapi disimpan sebagai pengkodean yang berbeda, maka MySQL akan memperlakukannya sebagai utf8
dan Anda dalam masalah. Artinya Anda harus memperbaiki ini dulu.
Apa yang harus diperiksa
Anda perlu memeriksa pengkodean aliran data di setiap lapisan.
- Periksa header HTTP, header.
- Periksa apa yang sebenarnya dikirim dalam isi permintaan.
- Jangan lupa bahwa MySQL memiliki pengkodean hampir di semua tempat:
- Database
- Tabel
- Kolom
- Server secara keseluruhan
- Klien
Pastikan ada orang yang tepat di mana-mana.
Konversi
Jika Anda menerima data misalnya windows-1250
, dan ingin menyimpannya utf-8
, gunakan SQL ini sebelum menyimpan:
SET NAMES 'cp1250';
Jika Anda memiliki data di DB sebagai windows-1250
dan ingin mengambil utf8
, gunakan:
SET CHARSET 'utf8';
Beberapa catatan lagi:
- Jangan mengandalkan alat yang terlalu "pintar" untuk menampilkan data. Misalnya phpMyAdmin tidak (melakukan ketika saya menggunakannya) pengkodean sangat buruk. Dan itu melewati semua lapisan sehingga sulit untuk menemukannya.
- Selain itu, Internet Explorer memiliki perilaku yang sangat bodoh dalam "menebak" pengkodean berdasarkan aturan yang aneh.
- Gunakan editor sederhana tempat Anda dapat beralih encoding. Saya merekomendasikan MySQL Workbench.