sql >> Database teknologi >  >> RDS >> Mysql

Hvordan undgår man junk-/skraldetegn, mens man læser data fra flere sprog?

Gujarati starter રેલવે , korrekt? Og Malyalam starter നേപ , korrekt? Og englænderne burde have inkluderet Bureau’s .

Dette er det klassiske tilfælde af

  • De bytes du har i klienten er korrekt kodet i utf8. (Bureau er kodet i Ascii/latin1-undersættet af utf8; men er ikke ascii-apostrof.)
  • Du har forbindelse med SET NAMES latin1 (eller set_charset('latin1') eller ...), sandsynligvis som standard. (Det skulle have været utf8 .)
  • Kolonnen i tabellen blev erklæret CHARACTER SET latin1 . (Eller muligvis blev det arvet fra tabellen/databasen.) (Det skulle have været utf8 .)

rettelsen til dataene er en "2-trins ALTER".

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

hvor længderne er store nok og de andre "..." har alt andet (NOT NULL osv.) var allerede på kolonnen.

Desværre, hvis du har mange kolonner at arbejde med, vil det tage mange ALTERs. Du kan (bør) MODIFY alle de nødvendige kolonner til VARBINARY for en enkelt tabel i et par ALTERs .

rettelsen til koden er at etablere utf8 som forbindelsen; dette afhænger af det api, der bruges i PHP. ALTERs vil ændre kolonnedefinitionen.

Rediger

Du har VARCHAR med det forkerte CHARACTER SET . Derfor ser du Mojibake som રેલ . De fleste konverteringsteknikker forsøger at bevare રેલ , men det er ikke det, du har brug for. Tag i stedet et skridt til VARBINARY bevarer bits og ignorerer den gamle definition af bits, der repræsenterer latin1-kodede tegn. Det andet trin bevarer igen bitsene, men hævder nu, at de repræsenterer utf8-tegn.




  1. Embedded Postgres til fjederstøvletest

  2. Maksimal længde af et tabelnavn i MySQL

  3. Gruppering af MySQL datetime i intervaller uanset tidszone

  4. Databasemodel for en køreskoles reservationssystem. Del 2