Gudżarati zaczyna રેલવે , prawidłowy? A maljalam zaczyna നേപ , prawidłowy? A angielski powinien był zawierać Bureau’s .
To klasyczny przypadek
- Bajty, które masz w kliencie, są poprawnie zakodowane w utf8. (
Bureaujest zakodowany w podzbiorze Ascii/latin1 utf8; ale’nie jest apostrofem ascii.) - Połączyłeś się z
SET NAMES latin1(lubset_charset('latin1')lub ...), prawdopodobnie domyślnie. (Powinien to byćutf8.) - Kolumna w tabeli została zadeklarowana jako
CHARACTER SET latin1. (Lub prawdopodobnie został odziedziczony z tabeli/bazy danych.) (Powinno to byćutf8.)
Poprawka danych to „dwuetapowa zmiana”.
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
gdzie długości są wystarczająco duże, a pozostałe „...” mają cokolwiek innego (NOT NULL , itp) był już na kolumnie.
Niestety, jeśli masz dużo kolumn do pracy, zajmie to wiele ALTERów. Możesz (powinieneś) MODIFY wszystkie niezbędne kolumny do VARBINARY dla jednej tabeli w parze ALTERs .
Poprawka kodu jest ustanowienie utf8 jako połączenia; zależy to od interfejsu API używanego w PHP. ALTERs zmieni definicję kolumny.
Edytuj
Masz VARCHAR z niewłaściwym CHARACTER SET . Dlatego widzisz Mojibake jak રેલ . Większość technik konwersji stara się zachować રેલ , ale to nie jest to, czego potrzebujesz. Zamiast tego zrób krok do VARBINARY zachowuje bity, ignorując starą definicję bitów reprezentujących znaki zakodowane w języku łacińskim1. Drugi krok ponownie zachowuje bity, ale teraz twierdzi, że reprezentują one znaki utf8.