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. (
Bureau
jest 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.