sql >> Databasteknik >  >> RDS >> Mysql

Hur undviker man skräp/skräptecken när man läser data från flera språk?

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 (eller set_charset('latin1') eller ...), förmodligen som standard. (Det borde ha varit utf8 .)
  • Kolumnen i tabellen deklarerades CHARACTER SET latin1 . (Eller möjligen ärvdes det från tabellen/databasen.) (Det borde ha varit utf8 .)

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.




  1. Finns det ett sätt att fråga om arrayfältet innehåller ett visst värde i Doctrine2?

  2. Hur man skapar ordningsnummer i PostgreSQL

  3. Överbrygga Azure-gapet:Hanterade instanser

  4. Slumpmässig post från en databastabell (T-SQL)