Mysql
 sql >> база данни >  >> RDS >> Mysql

Актуализиране на данни в базата данни MySQL след вмъкване на грешно кодиране

Страдате от "двойно кодиране".

Ето какво се случи.

  • Клиентът имаше символи, кодирани като utf8; и
  • SET NAMES latin1 излъга, като твърди, че клиентът има кодиране latin1; и
  • Колоната в таблицата е декларирана CHARACTER SET utf8 .

Нека разгледаме какво се случва с e-acute:é .

  1. Hex за това в utf8 е 2 байта:C3A9 .
  2. SET NAMES latin1 видя го като 2 знака, кодирани с latinica1 Ã и © (шестнадесетичен:C3 и A9 )
  3. Тъй като целта беше CHARACTER SET utf8 , тези 2 знака трябваше да бъдат преобразувани.Ã беше преобразуван в utf8 (шестнадесетичен C383 ) и © (шестнадесетичен C2A9 )
  4. И така, 4 байта бяха съхранени (шестнадесетичен C383C2A9 )

Когато го прочете обратно, бяха извършени обратните стъпки и крайният потребител вероятно не забеляза нищо лошо. Какво не е наред:

  • Съхранените данни са 2 пъти по-големи, отколкото трябва да бъдат (3 пъти за азиатски езици).
  • Сравненията за равно, по-голямо от и т.н. може да не работят според очакванията.
  • ORDER BY може да не работи според очакванията.

Нещо подобно ще поправи вашите данни:

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

Още дискусия иОще примери за поправяне




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не можа да се свърже:Загубена връзка с MySQL сървъра при „четене на първоначален комуникационен пакет“, системна грешка:0

  2. Завъртете набор от резултати на mysql и създайте html таблица/матрица

  3. Как да предадете параметри на обратно извикване на mysql заявка в nodejs

  4. Връщане на стойност, когато няма редове в PDO

  5. MySQL WHERE `character` ='a' съответства на a, A, Ã и т.н. Защо?