Bahasa Gujarati memulai રેલવે
, benar? Dan Malayalam memulai നേപ
, benar? Dan bahasa Inggris seharusnya menyertakan Bureau’s
.
Ini adalah kasus klasik
- Byte yang Anda miliki di klien dikodekan dengan benar di utf8. (
Bureau
dikodekan dalam subset Ascii/latin1 dari utf8; tapi’
bukan apostrof ascii.) - Anda terhubung dengan
SET NAMES latin1
(atauset_charset('latin1')
atau ...), mungkin secara default. (Seharusnyautf8
.) - Kolom pada tabel dideklarasikan
CHARACTER SET latin1
. (Atau mungkin itu diwarisi dari tabel/database.) (Seharusnyautf8
.)
Perbaikan untuk data adalah "ALTER 2 langkah".
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
di mana panjangnya cukup besar dan "..." lainnya memiliki apa pun (NOT NULL
, dll) sudah ada di kolom.
Sayangnya, jika Anda memiliki banyak kolom untuk dikerjakan, dibutuhkan banyak ALTER. Anda dapat (harus) MODIFY
semua kolom yang diperlukan untuk VARBINARY
untuk satu tabel dalam sepasang ALTERs
.
Perbaikan untuk kode adalah menetapkan utf8 sebagai koneksi; ini tergantung pada api yang digunakan dalam PHP. ALTERs
akan mengubah definisi kolom.
Sunting
Anda memiliki VARCHAR
dengan CHARACTER SET
yang salah . Karenanya, Anda melihat Mojibake seperti રેલ
. Sebagian besar teknik konversi mencoba mempertahankan રેલ
, tapi bukan itu yang Anda butuhkan. Sebagai gantinya, ambil langkah ke VARBINARY
mempertahankan bit sambil mengabaikan definisi lama bit yang mewakili karakter yang disandikan latin1. Langkah kedua lagi mempertahankan bit, tetapi sekarang mengklaim bahwa mereka mewakili karakter utf8.