In breve, perché se ne è già parlato mille volte:
- PHP contiene una stringa, ad esempio
"漢字"
, codificato in UTF-8. I byte per questo sonoE6 BC A2 E5 AD 97
. - Invia questa stringa su una connessione al database impostata su
latin1
. - Il database riceve i byte
E6 BC A2 E5 AD 97
, pensando che rappresentinolatin1
caratteri. - Il database memorizza i caratteri
æ¼¢å
(i caratteri cheE6 BC A2 E5 AD 97
mappa inlatin1
). - Lo stesso processo invertito fa sì che PHP riceva gli stessi byte, che poi tratta come UTF-8. Il roundtrip funziona bene per PHP, anche se il database non tratta i caratteri come dovrebbe.
Quindi il problema qui era che la connessione al database era impostata in modo errato quando i dati venivano inseriti nel database. Dovrai convertire i dati nel database nei caratteri corretti. Prova questo:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Forse utf8
non è quello che ti serve qui, sperimenta. Se funziona, cambialo in un UPDATE
dichiarazione per aggiornare i dati in modo permanente.