Simply.com is available in english

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):

  1. Prihláste sa do phpMyAdmin a vyberte databázu v ľavom paneli.
  2. Kliknite na kartu Operácie.
  3. Nájdite sekciu Sortering (Collation).
  4. Vyberte utf8mb4_unicode_ci v rozbaľovacom menu.
  5. Kliknite Vykonať.

Zmeňte existujúcu tabuľku (vrátane všetkých jej stĺpcov):

  1. Vyberte tabuľku v ľavom paneli.
  2. Kliknite na kartu Operácie.
  3. V sekcii Možnosti tabuľky vyberte nové triedenie.
  4. Zaškrtnite Zmeniť aj triedenie pre všetky stĺpce.
  5. 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 klienta
  • character_set_connection — čo server používa interne počas spracovania dotazu
  • character_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

Ďalšie relevantné články