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

Potíže se znaky UTF-8; co vidím, není to, co jsem uložil

Tento problém trápí účastníky tohoto webu a mnoho dalších.

Uvedli jste pět hlavních případů CHARACTER SET potíže.

Doporučený postup

Do budoucna je nejlepší použít CHARACTER SET utf8mb4 a COLLATION utf8mb4_unicode_520_ci . (V přípravě je novější verze řazení Unicode.)

utf8mb4 je nadmnožinou utf8 v tom, že zvládá 4bajtové kódy utf8, které potřebují Emoji a někteří Číňané.

Mimo MySQL se "UTF-8" vztahuje na všechna velikostní kódování, tudíž v podstatě stejné jako utf8mb4 MySQL , nikoli utf8 .

Pokusím se v následujícím textu použít tyto pravopisy a velká písmena k rozlišení uvnitř a vně MySQL.

Přehled toho, co byste měli udělat

  • Nastavte svůj editor atd. na UTF-8.
  • Formuláře HTML by měly začínat jako <form accept-charset="UTF-8"> .
  • Nechte své bajty zakódovat jako UTF-8.
  • Nastavte UTF-8 jako kódování používané v klientovi.
  • Mějte sloupec/tabulku deklarovat CHARACTER SET utf8mb4 (Zkontrolujte pomocí SHOW CREATE TABLE .)
  • <meta charset=UTF-8> na začátku HTML
  • Uložené rutiny získávají aktuální znakovou sadu/kompletaci. Mohou potřebovat přestavbu.

UTF- 8 až do konce

Další podrobnosti o počítačových jazycích (a jeho následující části)

Otestujte data

Zobrazení dat pomocí nástroje nebo pomocí SELECT nelze důvěřovat. Příliš mnoho takových klientů, zejména prohlížečů, se snaží kompenzovat nesprávné kódování a zobrazuje vám správný text, i když je databáze narušena. Vyberte si tabulku a sloupec, který obsahuje nějaký neanglický text, a udělejte to

SELECT col, HEX(col) FROM tbl WHERE ...

HEX pro správně uložené UTF-8 bude

  • Pro prázdné místo (v jakémkoli jazyce):20
  • Pro angličtinu:4x , 5x , 6x nebo 7x
  • Ve většině západní Evropy by písmena s diakritikou měla být Cxyy
  • cyrilice, hebrejština a perština/arabština:Dxyy
  • Většina Asie:Exyyzz
  • Emoji a některé čínské:F0yyzzww
  • Další podrobnosti

Konkrétní příčiny a opravy zjištěných problémů

Zkráceno text (Se pro Señor ):

  • Bajty, které mají být uloženy, nejsou kódovány jako utf8mb4. Opravte to.
  • Také zkontrolujte, zda je připojení během čtení UTF-8.

Černé diamanty s otazníky (Se�or pro Señor ); existuje jeden z těchto případů:

Případ 1 (původní bajty nebyly UTF-8):

  • Bajty, které mají být uloženy, nejsou kódovány jako utf8. Opravte to.
  • Připojení (nebo SET NAMES ) pro INSERT a SELECT nebyl utf8/utf8mb4. Opravte to.
  • Zkontrolujte také, že sloupec v databázi je CHARACTER SET utf8 (nebo utf8mb4).

Případ 2 (původní bajty byly UTF-8):

  • Připojení (nebo SET NAMES ) pro SELECT nebyl utf8/utf8mb4. Opravte to.
  • Zkontrolujte také, že sloupec v databázi je CHARACTER SET utf8 (nebo utf8mb4).

Černé kosočtverce se vyskytují pouze v případě, že je prohlížeč nastaven na <meta charset=UTF-8> .

Otazníky (běžné, nikoli černé diamanty) (Se?or pro Señor ):

  • Bajty, které mají být uloženy, nejsou kódovány jako utf8/utf8mb4. Opravte to.
  • Sloupec v databázi není CHARACTER SET utf8 (nebo utf8mb4). Opravte to. (Použijte SHOW CREATE TABLE .)
  • Také zkontrolujte, zda je připojení během čtení UTF-8.

Mojibake (Señor pro Señor ):(Tato diskuse se vztahuje také na Dvojité kódování , což nemusí být nutně viditelné.)

  • Bajty, které mají být uloženy, musí být v kódování UTF-8. Opravte to.
  • Připojení při INSERTing a SELECTing text musí specifikovat utf8 nebo utf8mb4. Opravte to.
  • Sloupec musí být deklarován jako CHARACTER SET utf8 (nebo utf8mb4). Opravte to.
  • HTML by mělo začínat <meta charset=UTF-8> .

Pokud data vypadají správně, ale nejdou správně seřadit, buď jste nevybrali špatné řazení, nebo neexistuje žádné řazení, které by vyhovovalo vašim potřebám, nebo máte Dvojité kódování .

Dvojité kódování lze potvrdit provedením SELECT .. HEX .. popsané výše.

é should come back C3A9, but instead shows C383C2A9
The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD

To znamená, že hex je asi dvakrát tak dlouhý, než by měl být. To je způsobeno převodem z latin1 (nebo čehokoli jiného) na utf8, pak se s těmito bajty zachází, jako by to byly latin1 a opakováním převodu. fungovat správně, protože je to například řazení, jako by řetězec byl Señor .

Oprava dat, kde je to možné

Pro Zkrácení a Otazníky , data jsou ztracena.

Pro Mojibake / Dvojité kódování , ...

Pro Černé diamanty , ...

Opravy jsou uvedeny zde. (5 různých oprav pro 5 různých situací; vybírejte pečlivě):http://mysql. rjweb.org/doc.php/charcoll#fixes_for_various_cases



  1. Alibaba Cloud

  2. získat záznamy za poslední tři měsíce z tabulky

  3. Jak opravit „název profilu není platný“ při aktualizaci profilu pošty databáze v SQL Server (T-SQL)

  4. Použití SQL Server Integration Services (SSIS) k naplnění záznamů QuickBooks