Používajte charset utf8mb4 a collation utf8mb4_unicode_ci v MySQL a zmeňte ich cez phpMyAdmin alebo ALTER‑príkazy, nezabudnite tiež na SET NAMES pre pripojenie.
Charset (znaková sada) určuje, aké znaky môže databáza uložiť, a collation určuje, ako sa znaky porovnávajú a triedia. Nesprávny charset je najčastejšou príčinou toho, že dánske písmená (æ, ø, å) alebo emodži sa zobrazujú ako otázniky alebo mojibake (napr. æ namiesto æ).
Používajte utf8mb4 ako charset a utf8mb4_unicode_ci ako collation. utf8mb4 podporuje všetky Unicode znaky vrátane emodži.
Zmeňte predvolené nastavenie pre celú databázu (platí len pre nové tabuľky):
utf8mb4_unicode_ci v rozbaľovacom menu.Zmeňte existujúcu tabuľku (vrátane všetkých jej stĺpcov):
Zmeňte predvolené nastavenie databázy:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Zmeňte tabuľku a všetky jej stĺpce:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
V phpMyAdmin môžete zmeniť charset pre stĺpec: vyberte tabuľku, kliknite Štruktúra, kliknite Zmeniť vedľa stĺpca a vyberte nové triedenie v definícii stĺpca.
Automaticky vygenerujte ALTER príkazy:
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';
Spustite výsledok v phpMyAdmin na karte SQL alebo cez príkazový riadok.
Charset databázy a charset pripojenia sú dve rôzne veci. Aj keď sú vaše tabuľky správne nastavené na utf8mb4, znaky sa môžu poškodiť počas prenosu, ak pripojenie medzi aplikáciou a MySQL používa iný charset.
SET NAMES utf8mb4 nastaví tri session premenné naraz:
character_set_client — čo server očakáva od klientacharacter_set_connection — čo server používa interne počas spracovania dotazucharacter_set_results — čo server odosiela späť klientoviSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Lepšia prax: používajte vstavanú charset možnosť ovládača namiesto manuálneho odosielania SET NAMES. To zabezpečuje, že funkcie ako mysqli_real_escape_string() a PDO::quote() používajú správny charset — inak môžete v zriedkavých prípadoch otvoriť dvere pre SQL‑injection.
Článok z kategórie podpory: MySQL