Diakritika v databázích

« zpět na JavaServer Page a Serverlety

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

Nezávazně vyzkoušejte webové stránky zdarma

Klientská sekce pro Vás

Spravujte své domény a hosting pohodlně 24 hodin denně

Kontakt pro zákazníky

Technická podpora

PO-PÁ 8:00-21:00
SO-NE, svátky 9:00-21:00

E-mail: podpora@banan.cz

Online pracovník

Patrik Jankov

+420 553 810 250

Online chat

Zvládáme opensource

Na našich serverech jsme ručně ověřili funkci více než 140 opensource systémů, některé z nich nabízíme na jedno kliknutí v administraci.

Hostované domény

8911 domén 7337 1574

Poslední článek - HOMEPAGE PRVKY

Webové stránky a eshop

Zdarma pro každého

Ověřit dostupnost domény
Technická podpora: +420 553 810 250podpora@banan.cz
Technická podpora 800-2100 (SO-NE 900-2100) X
Online pracovník: Patrik Jankov
+420 553 810 250
podpora@banan.cz nebo Online chat
Kontaktovat technickou podporu můžete zde
Kontaktovat technickou podporu můžete zde
PO-PÁ 800-2100 (víkendy a svátky 900-2100)