Charset a collation v MySQL databázi
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 æ).
Doporučené hodnoty
Použijte utf8mb4 jako charset a utf8mb4_unicode_ci jako collation. utf8mb4 podporuje všechny Unicode znaky včetně emoji.
Metoda 1: phpMyAdmin
Změna výchozího nastavení pro celou databázi (platí jen pro nové tabulky):
- Přihlaste se do phpMyAdmin a vyberte databázi v levém panelu.
- Klikněte na záložku Operace.
- Najděte sekci Řazení (Collation).
- Vyberte
utf8mb4_unicode_civ rozbalovacím menu. - Klikněte Proveď.
Změna existující tabulky (včetně všech jejích sloupců):
- Vyberte tabulku v levém panelu.
- Klikněte na záložku Operace.
- V sekci Možnosti tabulky vyberte nové řazení.
- Zaškrtněte Změnit také řazení pro všechny sloupce.
- Klikněte Proveď.
Metoda 2: SQL
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.
Převod všech tabulek najednou
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 připojení (SET NAMES)
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 klientovi
SET 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