Накратко, защото това е обсъждано хиляди пъти преди:
- PHP съдържа низ, кажете
"漢字"
, кодиран в UTF-8. Байтовете за това саE6 BC A2 E5 AD 97
. - Изпраща този низ през връзка с база данни, която е настроена на
latin1
. - Базата данни получава байтовете
E6 BC A2 E5 AD 97
, мислейки, че представляватlatin1
символи. - Базата данни съхранява знаците
æ¼¢å
(знаците, коитоE6 BC A2 E5 AD 97
съпоставя наlatin1
). - Същият процес, обърнат, кара PHP да получава същите байтове, които след това третира като UTF-8. Обръщането работи добре за PHP, въпреки че базата данни не третира знаците както трябва.
Така че проблемът тук беше, че връзката към базата данни беше зададена неправилно, когато данните бяха въведени в базата данни. Ще трябва да преобразувате данните в базата данни в правилните знаци. Опитайте това:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Може би utf8
не е това, от което се нуждаете тук, експериментирайте. Ако това работи, променете това в UPDATE
изявление за постоянно актуализиране на данните.