Simply.com is available in english

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

  1. Přihlaste se do phpMyAdmin a vyberte databázi v levém panelu.
  2. Klikněte na záložku Operace.
  3. Najděte sekci Řazení (Collation).
  4. Vyberte utf8mb4_unicode_ci v rozbalovacím menu.
  5. Klikněte Proveď.

Změna existující tabulky (včetně všech jejích sloupců):

  1. Vyberte tabulku v levém panelu.
  2. Klikněte na záložku Operace.
  3. V sekci Možnosti tabulky vyberte nové řazení.
  4. Zaškrtněte Změnit také řazení pro všechny sloupce.
  5. 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 klienta
  • character_set_connection — co server používá interně při zpracování dotazu
  • character_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

Další relevantní články