Použijte mysqli_set_charset
pro změnu kódování klienta na UTF-8 hned po připojení:
$mysqli->set_charset("utf8");
Klientské kódování je to, v čem MySql očekává váš vstup (např. když do vyhledávacího dotazu vložíte text dodaný uživatelem) a v čem vám poskytne výsledky (takže musí odpovídat vašemu výstupnímu kódování, aby echo
správně zobrazovat věci).
Je třeba, aby odpovídalo kódování vaší webové stránky, aby bylo možné zohlednit dva výše uvedené scénáře a kódování zdrojového souboru PHP (aby byly pevně zakódované části vašich dotazů interpretovány správně).
Aktualizace:Jak převést data vložená pomocí latin-1 na utf-8
Pokud jde o data, která již byla vložena pomocí nesprávného kódování připojení, existuje pohodlné řešení, jak problém vyřešit. Pro každý sloupec, který obsahuje tento druh dat, musíte provést:
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
Zástupné symboly table_name
, column_name
a existing_column_type
by měl být pokaždé nahrazen správnými hodnotami z vaší databáze.
Co to dělá, je
- Řekněte MySql, že potřebuje uložit data do tohoto sloupce v latin1. Tato znaková sada obsahuje pouze malou podmnožinu utf8, takže obecně tato konverze zahrnuje ztrátu dat, ale v tomto specifickém scénáři byla data již na vstupu interpretována jako latin1, takže nebudou žádné vedlejší účinky. MySql však interně převede bajtovou reprezentaci vašich dat tak, aby odpovídala tomu, co bylo původně odesláno z PHP.
- Převeďte sloupec na binární typ (
BLOB
), který nemá žádné související informace o kódování. V tomto bodě bude sloupec obsahovat nezpracované bajty, které jsou správným znakovým řetězcem utf8. - Převeďte sloupec na jeho předchozí typ znaku a sdělte MySql, že nezpracované bajty by měly být považovány za kódování utf8.
UPOZORNĚNÍ:Tento nerozlišující přístup můžete použít pouze v případě, že příslušný sloupec obsahuje pouze špatně vložená data. Všechna data, která byla správně vložena, budou zkrácena při prvním výskytu jakéhokoli jiného znaku než ASCII!
Proto je dobré to udělat hned teď, než vstoupí v platnost boční oprava PHP.