De Gujarati begint રેલવે , juist? En de Malyalam begint നേപ , juist? En de Engelsen hadden Bureau’s moeten bevatten .
Dit is het klassieke geval van
- De bytes die je in de client hebt, zijn correct gecodeerd in utf8. (
Bureauis gecodeerd in de Ascii/latin1 subset van utf8; maar’is niet de ascii-apostrof.) - Je hebt verbinding gemaakt met
SET NAMES latin1(ofset_charset('latin1')of ...), waarschijnlijk standaard. (Het hadutf8moeten zijn .) - De kolom in de tabel is verklaard
CHARACTER SET latin1. (Of misschien is het overgenomen van de tabel/database.) (Het hadutf8moeten zijn .)
De oplossing voor de gegevens is een "2-staps ALTER".
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
waar de lengtes groot genoeg zijn en de andere "..." hebben wat anders (NOT NULL , enz.) stond al op de kolom.
Helaas, als je veel kolommen hebt om mee te werken, zijn er veel ALTERs nodig. U kunt (moet) MODIFY alle benodigde kolommen voor VARBINARY voor een enkele tafel in een paar ALTERs .
De fix voor de code is om utf8 tot stand te brengen als de verbinding; dit hangt af van de api die in PHP wordt gebruikt. De ALTERs zal de kolomdefinitie veranderen.
Bewerken
Je hebt VARCHAR met de verkeerde CHARACTER SET . Daarom zie je Mojibake als રેલ . De meeste conversietechnieken proberen રેલ . te behouden , maar dat is niet wat je nodig hebt. In plaats daarvan, een stap zetten naar VARBINARY behoudt de bits en negeert de oude definitie van de bits die latin1-gecodeerde karakters vertegenwoordigen. De tweede stap bewaart opnieuw de bits, maar beweert nu dat ze utf8-tekens vertegenwoordigen.