Použijte charset utf8mb4 a collation utf8mb4_unicode_ci v MySQL a změňte je pomocí phpMyAdmin nebo příkazů ALTER, nezapomeňte také na SET NAMES pro připojení.
Charset (kódování znaků) určuje, jaké znaky může databáze uložit, a collation určuje, jak se znaky porovnávají a řadí. Nesprávné kódování znaků je nejčastější příčinou, že dánská písmena (æ, ø, å) nebo emoji se zobrazují jako otazníky nebo mojibake (např. æ místo æ).
Použijte utf8mb4 jako charset a utf8mb4_unicode_ci jako collation. utf8mb4 podporuje všechny Unicode znaky včetně emoji.
Změna výchozího nastavení pro celou databázi (platí jen pro nové tabulky):
utf8mb4_unicode_ci v rozbalovacím menu.Změna existující tabulky (včetně všech jejích sloupců):
Změna výchozího nastavení databáze:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Změna tabulky a všech jejích sloupců:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
V phpMyAdmin můžete změnit charset pro jednotlivý sloupec: vyberte tabulku, klikněte Struktura, klikněte Změnit u sloupce a vyberte nové řazení v definici sloupce.
Automatické generování ALTER příkazů:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';
Spusťte výsledek v phpMyAdmin na záložce SQL nebo přes příkazovou řádku.
Charset databáze a charset připojení jsou dvě odlišné věci. I když jsou vaše tabulky nastaveny na utf8mb4, mohou se znaky během přenosu poškodit, pokud připojení mezi aplikací a MySQL používá jiné kódování.
SET NAMES utf8mb4 nastaví tři proměnné relace najednou:
character_set_client — co server očekává, že obdrží od klientacharacter_set_connection — co server používá interně při zpracování dotazucharacter_set_results — co server posílá zpět klientoviSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Lepší praxe: použijte vestavěnou volbu charset v ovladači místo manuálního odesílání SET NAMES. To zajistí, že také funkce jako mysqli_real_escape_string() a PDO::quote() používají správné kódování — jinak můžete v ojedinělých případech otevřít cestu pro SQL‑injection.
Článek z kategorie podpory: MySQL