Gujarati börjar રેલવે
, korrekt? Och Malyalam börjar നേപ
, korrekt? Och engelskan borde ha inkluderat Bureau’s
.
Detta är det klassiska fallet med
- Byten du har i klienten är korrekt kodad i utf8. (
Bureau
är kodad i delmängden Ascii/latin1 av utf8; men’
är inte ascii-apostrof.) - Du ansluter med
SET NAMES latin1
(ellerset_charset('latin1')
eller ...), förmodligen som standard. (Det borde ha varitutf8
.) - Kolumnen i tabellen deklarerades
CHARACTER SET latin1
. (Eller möjligen ärvdes det från tabellen/databasen.) (Det borde ha varitutf8
.)
fixen för data är en "2-stegs ALTER".
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
där längderna är tillräckligt stora och de andra "..." har vad som helst (NOT NULL
, etc) fanns redan i kolumnen.
Tyvärr, om du har många kolumner att arbeta med, kommer det att krävas många ALTER. Du kan (bör) MODIFY
alla nödvändiga kolumner till VARBINARY
för en enda tabell i ett par ALTERs
.
fixen för koden är att upprätta utf8 som anslutning; detta beror på vilket api som används i PHP. ALTERs
kommer att ändra kolumndefinitionen.
Redigera
Du har VARCHAR
med fel CHARACTER SET
. Därför ser du Mojibake som રેલ
. De flesta konverteringstekniker försöker bevara રેલ
, men det är inte vad du behöver. Ta istället ett steg till VARBINARY
bevarar bitarna samtidigt som den gamla definitionen av bitar som representerar latin1-kodade tecken ignoreras. Det andra steget bevarar bitarna igen, men hävdar nu att de representerar utf8-tecken.