MySQL a kódování

Pro jednoho zákazníka jsem vytvořil redakční systém, který využívá pro ukládání textů MySQL. Jelikož se jednalo o web, kde je část textů v češtině, musel jsem nastudovat (už bylo na čase) problematiku kódování a řazení příspěvků v MySQL.

Všechno co zde bude popsáno by mělo fungovat od verze 4.1 MySQL pro tabulky MyISAM. U tabulek typu InnoDB je nutné mít verzi 4.1.2 nebo vyšší.

Nastavení znakové sady

Nastavení znakové sady se provádí pomocí příkazu SET CHARACTER SET. Např.: SET CHARACTER SET utf8 nastaví znakovou sadu dotazu i znakovou výsledku na UTF-8. Tento příkaz je důležité odeslat ihned po připojení k databázovému serveru. Další důležitý příkaz je SHOW CHARACTER SET, po jeho odeslání získáme seznam všech znakových sad, které server podporuje.

Podobného výsledku můžeme dosáhnout pomocí příkazu SET NAMES `utf8`, rozdíl je v tom, že takto nastavíme i znakovou sadu připojení k serveru.

Znakovou sadu je vhodné nastavit databázi a tabulkám již při jejich vytváření. Toho docílíme takto:

 CREATE DATABASE jmeno_databaze DEFAULT CHARACTER SET utf8;

CREATE TABLE pokus (
ID int(6) not null auto_increment primary key,
Text Text)
DEFAULT CHARACTER SET utf8; 

Nastavení znakové sady výsledků SQL dotazu

Toto je velmi užitečná vlastnost, která může ušetřit dost práce. Nejčastěji ji používám, když potřebuji vyexportovat data z MySQL do Excelu.

Změna výstupního kódování je velmi jednoduchá: SET CHARACTER_SET_RESULTS = cp1250; a dostaneme data ve znakové sadě windows-1250.

Nastavení porovnávání

Porovnávání (angl. collation) je sada pravidel, které určují jak se budou řadit jednotlivé položky tabulky. Správné nastavení je důležité pokud chcete v databázi vyhledávat a potřebujete výsledky řadit podle české abecedy.

Seznam porovnávání dostupných na serveru zjistíte pomocí SQL příkazu SHOW COLLATION;. Seznam obvykle obsahuje velké množství položek, proto je dobré výběr omezit pomocí operátoru LIKE, např. SHOW COLLATION LIKE ‘utf8%’;.

Porovnávání se určuje při vytváření databáze nebo tabulky. Samozřejmě ho lze později změnit pomocí příkazu ALTER.

 CREATE DATABASE jmeno_databaze
DEFAULT CHARACTER SET utf8
COLLATE utf8_czech_ci;

CREATE TABLE pokus (
ID int(6) not null auto_increment primary key,
Text Text)
DEFAULT CHARACTER SET utf8
COLLATE utf8_czech_ci; 

Literatura

MySQL manuál

Leave a Reply