Diakritika v databázích

Napsal Dalibor Baník (») 11. 4. 2006 v kategorii Databáze, přečteno: 6462×

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


Dat1

Ú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

 

Dat2

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)

 

 

Dat3

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)

 

 

Dat4

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
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
asi nevkládáte do databáze data v utf8 kodování
Spyro z IP 84.42.212.*** | 3.5.2006 11:34
stránka je v utf-8,
databáze utf-8_czech_ci
tabulka utf-8_czech_ci
sloupce utf-8_czech_ci, porovnání utf-8_czech_ci

A stejně mám v db místo diakritiky klikyháky
tecka z IP 62.129.60.*** | 19.4.2006 13:55
smajl


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel devět a jedna