Diakritika v databázích

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

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
pavel K z IP 24.223.144.*** | 18.7.2008 22:22
Dobry den, nevite prosim nekdo jak spravne vytvorit v php xml soubor tak aby mohl obsahovat ceske znaky?
uz dva dny se tim trapim a zadny vysledek. Kdyz xml vytvorim, nektere ceske znaky se nezobrazuji. Pokud xml vytvorim v notepadu, a ulozim ho jako unicode, vse normalne funguje.
Ja ale potrebuju xml vytvaret dinamicky z databaze. Dekuji za pripadnou pomoc.
Pavel.
Wilys z IP 88.101.25.*** | 20.6.2008 19:12
Mám chybu. Nezobrazuje se mi správně diakritika. (http://warcraft.scorpions.cz)

smajl
banan.czDalibor Baník | 23.6.2008 13:31
Diakritiku máte opravenou, k dalšímu doporučuji pročíst článek o možných chybách http://www.owebu.cz/banan/vypis.php?clanek=826
servacek z IP 193.86.229.*** | 10.2.2008 20:20
Četl jsem FAQ a snažil se vše nastavit aby to fungovalo. Včetně atributu 777. Soubor,který chci přenést má necelých 17MB.Je to 2.část RAR souboru, který by dohromady měl přes 30MB, což je max. limit pro soubor. Kopírování v total comanderu proběhne v pohodě, akorát soubor se na webu neobjeví. Kopírování v přes FTP doplňěk ve Firefoxu mi na konci hodí tuto hlášku:

"550-Quota exceeded: Ostatni.part2.rar won't be saved 550-4 files used ( 0% ) - authorized: 1000 files 550 28173 Kbytes used (91 % ) - authorized: 30720 Kb : /web/downloads/Ostatni.part2.rar"

Mám to chápat tak, že server sčítá části jednoho souboru, který winrar rozdělil? ?
banan-robert z IP 88.101.127.*** | 10.2.2008 22:12
[1] Server rozhodně nesčítá dva soubory, tak jak naznačujete. Je pouze omezena ¨maximální velikost jednoho souborun na 30MB, počet souborů na 1000 o celkové velikosti 1GB.
banan.czMgr.Radovan Kaluža | 11.2.2008 00:59
[1]
prosím proč je diskuze pod článkem "Diakritika v databázích" ?
banan.czMgr.Radovan Kaluža | 11.2.2008 01:06
velikost souboru je omezena u freehostingu, nikoliv u placeneho hostingu www.banan.cz
servacek z IP 193.86.229.*** | 11.2.2008 21:42
Omluvám se nevšilm jsem si, že jsem při hledání řešení začal dotaz v sekci Diakritika. Ale v tom případě mi není jasné proč mi ten soubor nejde nakopírovat?
banan.czMgr.Radovan Kaluža | 12.2.2008 00:51
odpoveděl vám robert habrman v [2]
pvdeejay z IP 91.127.109.*** | 17.2.2008 08:32
Dobrý deň,
ak to správne chápem, limitom je buď 30 MB alebo 1000 súborov nech majú akú koľvek veľkosť. Ja sa pokúšam na free hosting nainštalovať phpBB3, ktoré v rátane slovenskej lokalizácie pozostáva z  61 priečinkov a 997 súborov o celkovej veľkosti asi 8.5 MB.
Ešte tam nemám dohraté ani všetky súbory a už mi systém hlásy "quota exceeded". Môžem v tomto prípade niečo robiť?
| 17.2.2008 08:36
Dobry den,

aktualne s tim nelze nic moc nadelat, mohu Vam vsak nabidnout webhosting bez reklam s diskovou kvotou 8000MBytes a to bez omezeni poctu souboru za prijatelnych 75,- Kc bez DPH za mesic...

S pranim hezkeho dne, Carbol Martin
ondra z IP 82.150.166.*** | 9.12.2007 15:17
ahoj
mam s tímhle problém nechce mi to delat ž ř , mam zaklad 1250satku generala , jako u vsech mých projektů /vetsinou jiné servery než banan/ ted znami pořidil na bananu a s databazi zkopirovanou do prtě to nejak nelze rozjet vložení z guestbooku !, zt phpadminu bez problémů .. takže myslim že bude neco chybet v na urovni html .. poradí někdo ???
| 9.12.2007 15:27
Dobrý den,

ve své aplikaci nastavte správnou znakovou sadu pro připojení k MySQL. (Odhaduji, že používáte MySQL, protože většina guestbooku jej používá...)
Například v případě využívání rozšíření MySQLi se jedná o funkci mysqli_set_charset.

S přáním hezkého dne,
Carbol Martin
banan-filip z IP 88.101.127.*** | 10.12.2007 16:13
pripadne poslete cely kus kodu at je jasne kam se ma funkce vlozit takhle se spatne radi dost azalezi jestli pouzivate mysql nebo mysqli a pripadne i objektove pouzivani leccos v zapisu zmeni
hu z IP 217.11.240.*** | 13.9.2006 11:29
dobrý den, potřebuji v phpmyadmin změnit tabulky v databázi z latin2 na utf8, ale jsem v tomto totální amatér. poraďte prosím vás s řešením.

problém je: latin2 mám v databázi a utf8 v souborech nové verze wordpressu. když použiji latin2, tak se diakritika na vlastním webu zobrazuje správně, ale nefunguje admin rozhraní (lze se přihlásit do systému, ale nemohu publikovat ani nic jiného), naopak s utf8 funguje admin, ale diakritika na stránkách ne. nevím si s tím rady..
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
asi nevkládáte do databáze data v utf8 kodování
Spyro z IP 84.42.212.*** | 3.5.2006 17:21
Díky za odpověď, teď už diakritika fachá.
Pro všechny uživatele Coppermine gallery v. 1.4.5., kteří mají problémy s kódováním, podku jste nastavili všechny atributy na utf-8_czech_ci, vložte za řádek 180 v includes/functions.inc.php @mysql_query(\'SET NAMES UTF8\'); .
Vše již pak pojede bez problémů
Spyro z IP 84.42.212.*** | 3.5.2006 17:21
samozřejmě bez \\, který to tam hodilo
agila77.com z IP 195.113.166.*** | 9.5.2006 07:18
Spyro nedal bys mě email rád bych Tě poprosil kdybys mě ten upravený soubor poslal
tubes z IP 213.81.199.*** | 11.7.2006 22:49
Kde je súbor (niečo take ako database.php) v phpBB kde by som napisal to @mysql_query(\'SET NAMES UTF8\'); ?? už som to napísal skoro všade...
Spyro z IP 84.42.212.*** | 12.7.2006 09:10
includes/db.php
stačí tu řádku umístit na konec souboru
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 šest a deset