Krótko mówiąc, ponieważ omawiano to już tysiąc razy:
- PHP przechowuje ciąg, powiedzmy
"漢字"
, zakodowane w UTF-8. Bajty do tego toE6 BC A2 E5 AD 97
. - Wysyła ten ciąg przez połączenie z bazą danych, które jest ustawione na
latin1
. - Baza danych otrzymuje bajty
E6 BC A2 E5 AD 97
, myśląc, że reprezentują onelatin1
znaków. - Baza danych przechowuje znaki
æ¼¢å
(znaki, któreE6 BC A2 E5 AD 97
mapuje wlatin1
). - Ten sam odwrócony proces powoduje, że PHP otrzymuje te same bajty, które następnie traktuje jako UTF-8. Roundtrip działa dobrze w PHP, nawet jeśli baza danych nie traktuje znaków tak, jak powinna.
Problem polegał na tym, że połączenie z bazą danych zostało ustawione niepoprawnie podczas wprowadzania danych do bazy danych. Będziesz musiał przekonwertować dane w bazie danych na prawidłowe znaki. Spróbuj tego:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Może utf8
nie jest tym, czego potrzebujesz, eksperymentuj. Jeśli to zadziała, zmień to na UPDATE
oświadczenie o stałej aktualizacji danych.