čeština v DB

Dobrý den.
Chtěl bych vědět, proč záznamy v databázi nejsou správně česky (nefungují znaky ěščřžýáíé). Když je ovšem z databáze vypíši, tak se zobrazí správně česky. Neví někdo, čím by to mohlo být?
Toto je častá chyba při použití databáze v PHP. Aby byla databáze korektně česky, musíte před použitím SQL dotazu ještě zavolat SQL dotaz SET NAMES, kterým nastavíte použité kódování databáze. Není-li uvedeno, použije se kódování nastavené serveru. To je však odlišné a tak vznikne patlanina. Že se čeština zobrazuje správně v aplikaci, je pouze shoda náhod.
<HTML>Přesně tak, s databází je potřeba pracovat korektně. Každý textová kolonka v tabulce má nastavitelné kódování. Doporučuje se nastavit jednotné kódování pro celou databázi.

(Osobně doporučuji používat utf8 s českým řazením. S jinými kódováními je problém s místním PHPmyAdminem, chcete-li jej používat k přímé úpravě dat.)

Při komunikaci PHP skriptu s databází je potřeba nastavit kódování před zadáním prvního dotazu v rámci spojení. K tomu je SQL dotaz SET CHARACTER SET (alternativně SET NAMES, který umí nastavit i řazení).

(Já tedy volám: SET CHARACTER SET utf8)

Samozřejmostí je, aby data v příslušném kódování byla potom převedena do správného zobrazovacího kódování. Na to existuje knihovna iconv. Osobně však (a řekl bych, že nejspíše všichni) zobrazuji ve stejném kódování - v každém případě je třeba klientovi říct, v jakém kódování jsou data zobrazena - k tomu jsou content-type, BOM apod.</HTML>
Nejsem si jist, zda vám rozumím. Kódování na webu mám utf-8 (meta content type). Databázi jsem přebedl do kódování utf-8_czech_ci a jako úplně první SQL příkaz jsem dal:

$sql = "SET NAMES 'utf8_czech_ci'";

mysql_query ($sql)
or die ("Chyba:".mysql_error());

a stále nic, v databázi jsou místo písmen s diakritikou čtverečky nebo neznámá hatmatilka, ale na stránce se to vyvolaná data z databáze vypisují dobře.
Jen: $sql = "SET NAMES 'utf8'";

utf8_czech_ci je už porovnání (upřesnění kódování).

Existující záznamy zůstávají tak, jak byly uloženy. Změna SET NAMES to neovlivní. Pouze by měl záznamy na webu zobrazit špatně.
Nové záznamy s tímto nastavením by měl zobrazit už správně.
Musí to být až za mysql_connect. Ale v phpmyadmin to správně česky není.
A které záznamy? Ty, které už tam byly nebo ty nové?
Ty staré se i nadále budou v phpMyAdmin zobrazovat špatně, protože tak špatně byly uloženy. SET NAMES to nespraví. Musíte ty špatné záznamy upravit.
Jestli se to děje u nových záznamu, pak je něco špatně.

Ten SET NAMES jsme uvedli proto, že ten provede správné uložení nebo načtení češtiny. Ovšem platí to až při jeho aplikaci. tedy na budoucí záznamy.
Právě že i ty nové jsou v phpMyAdmin špatně.
Pak máš stále něco špatně:
- kódování v HTML
- SET NAMES
- porovnáváni v db

Ještě může nastat situace, že údaje poslané ze stránek a zobrazené na stránkách jsou správně, ale v phpMyAdminovi špatně. Pak musíš nastavit správné porovnávání a i při přihlašování se dá zvolit kódování. Toto se stává např, když dojde k upgradu verze MySQL a všemu se implicitně nastaví švédské kódování, což potěší...
Vyřešeno.