Několik rad pro všechny, kteří mají problém se zobrazením diakritiky
Podpora kódování databází
Podpora změny kódování, implementovaná v MySQL od verze 4.1 umožňuje ukládat data s použitím rozdílného kódování a porovnávání. Můžeme určit kódovou stránku pro server, databázi, tabulku nebo jednotlivý sloupec.
Kde vznikají nesrovnalosti
Problémy mohou nastat v případě, kdy jsou použitá rozdílná kódování pro užití na stránce, v databázi, ale také v komunikaci mezi klientským programem a MySQL serverem.
Chcete-li aby klientský program komunikoval se serverem s použitím kódováním odlišným od výchozího (pro MySQL 4.1 se jedná o latin1), budete jej muset specifikovat. Například, k použití kódování UTF8 zadejte za připojení k serveru:@mysql_query("SET NAMES UTF8");
Teorie kódování a porovnávání
Znaková stránka je sadou symbolů a jejich přiřazení kódům. Porovnávání je sadou pravidel pro řazení znakové sady. Předpokládejme že existují znaky 'A', 'B', 'a', 'b'. Zjednodušeně bychom mohli kódování nastavit takto:
- 0 = A
- 1 = B
Protože 0 je menší než 1, bude při porovnávání A před písmenem B. Porovnávání je tedy pouze sadou pravidel, která určuje pořadí jednotlivých znaků kódové tabulky. Nejjednodušší z možných porovnávání nazýváme binární porovnávání.
Při porovnávání můžeme vybrat mimo určité znakové sady také honodty:
- cs - case-sensitive collation (porovnávání znaků rozpoznává jejich velikost)
- ci - case-insensitive collation (velikost znaků se při porovnávání nerozlišuje).
- bin - binární porovnávání
Každému kódování je přiřazeno výchozí porovnávání a naopak, např.:
- latin1 - latin1_swedish_ci
- latin2 - latin2_general_ci
- cp1250 - cp1250_general_ci
Kódování databáze prakticky
Není-li nastaveno/uvedeno jinak, bude použito výchozí kódování. Dle kódování je rovněž přiřazeno výchozí porovnávání a naopak. Použité kódování je specifikováno uvedením CHARACTER SET, synonymem je CHARSET.
Při importu databáze můžeme kódování určit v souborech pomocí CREATE DATABASE ... DEFAULT CHARACTER SET ... popř. také COLLATION ...
Pokud neuvedeme hodnotu COLLATION, bude použita hodnota výchozí pro dané kódování.
Např.:CREATE DATABASE db_jmeno
CHARACTER SET charset_jmeno
COLLATE collation_jmeno
... popř.
ALTER DATABASE db_jmeno
CHARACTER SET charset_jmeno
COLLATE collation_jmeno
Hledáme chyby
Dojde-li k nesrovnalosti ve zobrazení znaků s diakritikou, ověříme následující:
- používáte shodné kódování na stránce a v databázi?
- jsou data správně zobrazena v phpMyAdminu?
- máte nastaveno kódování za připojením k databázi?
Open Source
Při potížích s open source projekty je zpravidla problémem najít funkci, kde je konstruováno připojení k databázi. Níže uvádíme některé z nich:
osCommerce: - soubor /includes/functions/database.php
zde pod řádek if ($$link) mysql_select_db($database);
doplňte:mysql_query("SET NAMES cp1250;",$$link);
WordPress - soubor /wp-includes/wp-db.php
zde pod řádek $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
doplňte:@mysql_query ("SET NAMES cp1250;", $this->dbh);
Zde uvedené kódování je platné pro stránku v kódování windows-1250. U dalších produktů řešte obdobně.
Možnosti nastavení kódování v phpMyAdmin
Na několika místech máme možnost nastavit kódování či porovnávání přímo v phpMyAdminu
Úvodní stránka phpMyAdminu
- zde určujeme v jakém kódování budeme data prohlížet
- nastavení je důležité, pokud hodláme měnit hodnoty v phpMyAdminu
Seznam tabulek v databázi
- zde vidíme jaké porovnávání je použito pro jednotlivé tabulky
- na posledním řádku je uvedeno výchozí porovnáváním pro databázi (nové tabulky)
Seznam sloupců v tabulce
- zde vidíme jaké porovnávání je použito pro jednotlivé sloupce
- pro každý ze sloupců může být nastaveno rozdílné porovnávání/kódování (nedoporučujeme)
Výchozí porovnávání/kódování databáze
- zde můžeme nastavit výchozí porovnáváním/kódování pro nové tabulky/sloupce (záložka Úpravy)
- následná změna nemění již vytvořené tabulky/sloupce, pouze určí výchozí hodnotu
Poznámky
- při exportu jsou data uložena v kódování UTF8
- při importu dat můžeme zvolit, v jakém kódování je soubor uložen (doporučujeme UTF8)
- nemáme-li uvedeno kódování (SET NAMES), spoléháme na výchozí nastavení serveru (nedoporučujeme)
- při kompletní opravě nejdříve provedeme export do souboru, kontrolu/úpravu a následný import zpět do DB
- více o problematice kódování naleznete v manuálu MySQL