Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Untuk menggunakan utf8 atau tidak - masalah penyandian karakter MySQL dan PHP

Masalah Anda adalah SET NAMES 'utf8_persian_ci' Anda perintah tidak valid (utf8_persion_ci adalah kolasi , bukan pengkodean ). Jika Anda menjalankannya di terminal, Anda akan melihat kesalahan Unknown character set: 'utf8_persian_ci' . Jadi aplikasi Anda, ketika disimpan data, menggunakan latin1 set karakter. MySQL menafsirkan input Anda sebagai karakter latin1 yang kemudian disimpan dikodekan sebagai utf-8. Demikian juga ketika data ditarik kembali, MySQL mengonversinya dari UTF-8 kembali ke latin1 dan (semoga, sebagian besar waktu) byte asli yang Anda berikan.

Dengan kata lain, semua data Anda dalam database benar-benar kacau, tetapi kebetulan saja berhasil.

Untuk memperbaikinya, Anda perlu membatalkan apa yang Anda lakukan. Cara paling mudah adalah menggunakan PHP:

  1. SET NAMES latin1;
  2. Pilih setiap bidang teks dari setiap tabel.
  3. SET NAMES utf8;
  4. Perbarui baris yang sama menggunakan string yang sama tanpa diubah.

Atau Anda dapat melakukan langkah-langkah ini di dalam MySQL, tetapi ini rumit karena MySQL memahami data berada dalam kumpulan karakter tertentu. Anda perlu mengubah kolom teks Anda menjadi tipe BLOB, lalu memodifikasinya kembali untuk jenis teks dengan set karakter utf8. Lihat bagian di bawah ALTER TABLE Dokumentasi MySQL berlabel "Peringatan" berwarna merah .

Setelah Anda melakukan salah satu dari hal-hal ini, byte yang disimpan di kolom database Anda akan menjadi kumpulan karakter aktual yang mereka klaim. Kemudian, pastikan Anda selalu menggunakan mysql_set_charset('utf8') pada akses database apa pun dari PHP yang mungkin Anda lakukan di masa mendatang! Jika tidak, Anda akan mengacaukan segalanya lagi. (Catatan, jangan gunakan mysql_query('SET NAMES utf8') sederhana ! Ada kasus sudut (seperti koneksi reset) di mana ini dapat diatur ulang ke latin1 tanpa sepengetahuanmu. mysql_set_charset() akan mengatur charset kapan pun diperlukan.)

Akan lebih baik jika Anda beralih dari mysql_* fungsi dan menggunakan PDO sebagai gantinya dengan charset=utf8 parameter di PDO dsn Anda .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MAMP dengan Laravel Unix Socket

  2. Salin massal DataTable ke MySQL (mirip dengan System.Data.SqlClient.SqlBulkCopy)

  3. Campuran ilegal dari susunan (utf8mb4_unicode_ci,IMPLICIT) dan (utf8mb4_general_ci,IMPLICIT) untuk operasi '='

  4. PILIH catatan terbaru dengan nilai bukan nol dalam satu kolom

  5. Bagaimana Fungsi UCASE() Bekerja di MySQL