Znaková sada a collation v MySQL-databáze
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 æ).
Odporúčané hodnoty
Používajte utf8mb4 ako charset a utf8mb4_unicode_ci ako collation. utf8mb4 podporuje všetky Unicode znaky vrátane emodži.
Metóda 1: phpMyAdmin
Zmeňte predvolené nastavenie pre celú databázu (platí len pre nové tabuľky):
- Prihláste sa do phpMyAdmin a vyberte databázu v ľavom paneli.
- Kliknite na kartu Operácie.
- Nájdite sekciu Sortering (Collation).
- Vyberte
utf8mb4_unicode_civ rozbaľovacom menu. - Kliknite Vykonať.
Zmeňte existujúcu tabuľku (vrátane všetkých jej stĺpcov):
- Vyberte tabuľku v ľavom paneli.
- Kliknite na kartu Operácie.
- V sekcii Možnosti tabuľky vyberte nové triedenie.
- Zaškrtnite Zmeniť aj triedenie pre všetky stĺpce.
- Kliknite Vykonať.
Metóda 2: SQL
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.
Konvertovať všetky tabuľky naraz
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 pripojenia (SET NAMES)
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äť klientovi
SET 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