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 rappresentinolatin1caratteri. - Il database memorizza i caratteri
æ¼¢å(i caratteri cheE6 BC A2 E5 AD 97mappa 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.