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.
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
nebo7x
- 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
) proINSERT
aSELECT
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
) proSELECT
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žijteSHOW 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
aSELECTing
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