sql >> Databáze >  >> RDS >> Mysql

Jak se vyhnout nevyžádaným/zbytečným znakům při čtení dat z více jazyků?

Gudžarátština začíná રેલવે , správně? A Malyalam začíná നേപ , správně? A angličtina by měla obsahovat Bureau’s .

Toto je klasický případ

  • Bajty, které máte v klientovi, jsou správně zakódovány v utf8. (Bureau je zakódován v podmnožině Ascii/latin1 utf8; ale není apostrof ascii.)
  • Připojili jste se k SET NAMES latin1 (nebo set_charset('latin1') nebo ...), pravděpodobně ve výchozím nastavení. (Mělo to být utf8 .)
  • Sloupec v tabulce byl deklarován jako CHARACTER SET latin1 . (Nebo to možná bylo zděděno z tabulky/databáze.) (Mělo to být utf8 .)

Oprava dat je "2-step ALTER".

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

kde jsou délky dostatečně velké a ostatní "..." mají cokoliv jiného (NOT NULL , atd.) byl již ve sloupci.

Bohužel, pokud máte hodně sloupců, se kterými můžete pracovat, bude to vyžadovat hodně ALTERů. Můžete (měli byste) MODIFY všechny potřebné sloupce do VARBINARY pro jednu tabulku ve dvojici ALTERs .

Oprava kódu je navázat utf8 jako spojení; to závisí na API používaném v PHP. ALTERs změní definici sloupce.

Upravit

Máte VARCHAR se špatnou CHARACTER SET . Mojibake tedy vidíte jako રેલ . Většina konverzních technik se snaží zachovat રેલ , ale to není to, co potřebujete. Místo toho udělejte krok k VARBINARY zachovává bity a ignoruje starou definici bitů reprezentujících znaky kódované latinkou. Druhý krok opět zachovává bity, ale nyní tvrdí, že představují znaky utf8.




  1. Jak YEAR() funguje v MariaDB

  2. Formátování příkazového řádku MySQL s UTF8

  3. Proč nemohu udělat a s x jako (...) s ADODB a Oracle?

  4. Upozornění:Převod pole na řetězec v