sql >> Databáze >  >> RDS >> Mysql

podivné kódování znaků uložených dat, starý skript je ukazuje dobře, nový ne

Zkrátka proto, že už se to tu probíralo tisíckrát:

  1. PHP obsahuje řetězec, řekněte "漢字" , kódované v UTF-8. Tyto bajty jsou E6 BC A2 E5 AD 97 .
  2. Odešle tento řetězec přes databázové připojení, které je nastaveno na latin1 .
  3. Databáze přijímá bajty E6 BC A2 E5 AD 97 , myslet si, že představují latin1 znaky.
  4. V databázi jsou uloženy znaky æ¼¢å­ (znaky, které E6 BC A2 E5 AD 97 mapuje na v latin1 ).
  5. Stejný proces obrácený způsobí, že PHP obdrží stejné bajty, které pak považuje za UTF-8. Zpáteční cesta funguje dobře pro PHP, i když databáze nezachází se znaky tak, jak by měla.

Problém zde tedy byl, že při zadávání dat do databáze bylo špatně nastaveno připojení k databázi. Budete muset převést data v databázi na správné znaky. Zkuste toto:

SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name

Možná utf8 není to, co zde potřebujete, experimentujte. Pokud to funguje, změňte to na UPDATE prohlášení k trvalé aktualizaci dat.



  1. Připojení CodeIgniter MSSQL

  2. Jak vložit řetězec do jiného řetězce na SQL Server pomocí STUFF()

  3. Správa uživatelů MySQL

  4. Rozdíl mezi klauzulemi ON a WHERE ve spojeních tabulek SQL