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

Memperbarui data dalam database MySQL setelah memasukkan pengkodean yang salah

Anda menderita "pengkodean ganda".

Inilah yang terjadi.

  • Klien memiliki karakter yang dikodekan sebagai utf8; dan
  • SET NAMES latin1 berbohong dengan mengklaim bahwa klien memiliki penyandian latin1; dan
  • Kolom dalam tabel menyatakan CHARACTER SET utf8 .

Mari kita lihat apa yang terjadi pada e-acute:é .

  1. Hex untuk itu, di utf8 adalah 2 byte:C3A9 .
  2. SET NAMES latin1 melihatnya sebagai 2 karakter yang disandikan latin1 Ã dan © (hex:C3 dan A9 )
  3. Karena targetnya adalah CHARACTER SET utf8 , 2 karakter tersebut perlu dikonversi.Ã telah dikonversi ke utf8 (hex C383 ) dan © (hex C2A9 )
  4. Jadi, 4 byte disimpan (hex C383C2A9 )

Saat membacanya kembali, langkah sebaliknya dilakukan, dan pengguna akhir mungkin tidak melihat ada yang salah. Apa yang salah:

  • Data yang disimpan 2 kali lebih besar dari yang seharusnya (3x untuk bahasa Asia).
  • Perbandingan untuk sama, lebih besar dari, dll mungkin tidak berfungsi seperti yang diharapkan.
  • ORDER BY mungkin tidak berfungsi seperti yang diharapkan.

Sesuatu seperti ini akan memperbaiki data Anda:

UPDATE ... SET col = CONVERT(BINARY(CONVERT(
                         CONVERT(UNHEX(col) USING utf8)
                         USING latin1)) USING utf8);

Diskusi lebih lanjut danContoh lainnya untuk memperbaikinya




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Metode async MySQL C# tidak berfungsi?

  2. Bagaimana cara terhubung ke database MySQL melalui ODBC dari aplikasi Qt?

  3. Konversi pernyataan gabungan ke MYSQL menggunakan kunci duplikat

  4. Bagaimana cara mengubah kueri SELECT MySQL ini menjadi kueri DELETE?

  5. Sudah ada DataReader yang terbuka... padahal belum