Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cập nhật dữ liệu trong cơ sở dữ liệu MySQL sau khi chèn sai mã hóa

Bạn bị "mã hóa kép".

Đây là những gì đã xảy ra.

  • Máy khách có các ký tự được mã hóa là utf8; và
  • SET NAMES latin1 nói dối bằng cách tuyên bố rằng khách hàng có mã hóa latin1; và
  • Cột trong bảng được khai báo CHARACTER SET utf8 .

Hãy xem qua những gì xảy ra với e-cấp tính:é .

  1. Hệ lục phân cho điều đó, tính bằng utf8 là 2 byte:C3A9 .
  2. SET NAMES latin1 xem nó là 2 ký tự được mã hóa latin1 é (hex:C3A9 )
  3. Vì mục tiêu là CHARACTER SET utf8 , 2 ký tự đó cần được chuyển đổi. Ã đã được chuyển đổi thành utf8 (hex C383 ) và © (hex C2A9 )
  4. Vì vậy, 4 byte đã được lưu trữ (hex C383C2A9 )

Khi đọc ngược lại, các bước ngược lại đã được thực hiện và người dùng cuối có thể nhận thấy không có gì sai. Có gì sai:

  • Dữ liệu được lưu trữ lớn gấp 2 lần (gấp 3 lần đối với các ngôn ngữ Châu Á).
  • Các phép so sánh bằng, lớn hơn, v.v. có thể không hoạt động như mong đợi.
  • ORDER BY có thể không hoạt động như mong đợi.

Một cái gì đó như thế này sẽ sửa chữa dữ liệu của bạn:

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

Thảo luận khác Các ví dụ khác về cách khắc phục sự cố này




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập data.sql MySQL Docker Container

  2. MySQL chuyển đổi datetime thành unixtime?

  3. Hướng dẫn thiết kế cơ sở dữ liệu cho hệ thống mạng xã hội trong MySQL

  4. bộ nhớ cache truy vấn không hoạt động

  5. Cách áp dụng phân trang cho kết quả của truy vấn SHOW TABLES trong PHP