Kódování v MySQL

Dobrý den,
mám následující problém. Data z formuláře (kódování win1250) jsem pomocí skriptu uložil do MySQL databáze. Při prohlížení databáze v phpMyAdminovi se místo písmen s diakritikou ukázaly otazníky. Když jsem data načetl a zobrazil v prohlížeči, vše bylo OK. Ale když jsem je poslal přes funkci Mail(), přišly otazníky. Nejdřív mě napadlo předělat databázi na win1250 ale nepřišel jsem jak na to. Přepsal jsem tedy stránku s formulářem do UTF-8, ale opět při prohlížení databáze tam byly nesmyslné znaky. Díky Norek
phpMyAdmin vždy zobrazuje nesmyslná data ;)

Pokud jde o kódování, tak musí platit zásadní pravidlo. Všude musí odpovídat stejné kódování. To jest jak na stránkách, tak i v DB a stejně tak i v emailu.

Pokud je někde nesrovnalost, tak lze provést konverzi. V PHP pomocí iconv() a dalších. V MySQL pomocí SET NAMES. V emailu je pak potřeba vložit informaci o použitém kódování.
=Norek=
S pouzitym kodovanim v emailu je to slozitejsi .. Napriklad je problem poslat e-mail v kodovani win1250 ze skritpu, ktery je psan v utf-8. (Dokonce to dela problemy i s pouzitim iconv..).
Navic k odesilani e-mailu doporucuji pouzit Content-Transfer-Encoding: base64. V php k tomu existuje fce base64_encode().
php/html script - kodovani utf8
* header();
* meta tag
php pripojeni k databazi - utf8
* SET NAMES
mysql - nastavani databaze/tabulek - utf8
... Pak je vse obvykle dobre.

php/html script - kodovani win1250
* header();
* meta tag
php pripojeni k databazi - utf8
* SET NAMES
mysql - nastaveni databaze/tabulek - utf8
... Pak je vse obvykle dobre.

Jakakoliv jina kombinace je obvykle spatne. Uvedu priklad, svuj tip, jak to mas
php/html script - kodovani win1250
* meta tag
php pripojeni k databazi - ?
mysql - nastavani databaze/tabulek - ?
...jinymi slovy spolehas na default nastaveni a to muze byt
php pripojeni k databazi = mysql-nastaveni databaze = latin1
mysql - nastaveni tabulek - utf8
Vysledkem je, ze pri cteni a psani se prozene win1250 pres latin1 filtr a zobrazi se asi dobre ve win1250. Ale phpmyadmin nastaveny na zobrazovani v utf8 se zobrazi spatne. Cili se to chova ok vzhledem k nastaveni
Já mám podobný problém, když do databáze zapisuju přes formulař, tak je všechno v pořádku, háčky a čárky na výstupu jsou zobrazeny správně.
Ještli že však upravím obsah řádku v databázi přímo, je to proměná typu text a Latin2 a charakter tabulky utf8, tak na výstupu se mi nezobrazí správně š a ž ale otazníky.

Na vstupní i výstupní stránce mám
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">


Zkoušel jsem si stím všelijak hrát stím nastavením tabulek latin2 ale stím utf8 jsem nehejbal.
Latin2 neni windows-1250, mas spatne nastavenou tabulku.
Navrhuji udelat export databaze bez kodovani.
Smazat a vlozit strukturu tabulek s kodovanim cp1250
Importovat data bez kodovani.
Pak pri prepnutem phpadminovi na 1250 se zobrazi ok kodovani a i ve tvych programech.
Ja navrhuji uplne se vystridat silenemu kodovani win1250. S tim jsou vzdycky problemy:)

Imho je idealni latin2 a utf8 (jen u unicode si musi clovek davat pozor na nektere vicebytove znaky..)
Nesouhlasím. Používám win-1250 na jednom svém webu, který jsem už několikrát migroval na různé servery a vždy jsem to bez problémů rozchodil včetně databáze. Předělávat ho na jiné kódování nebudu. Takže, když se to umí, není problém užívat win-1250.

Proč nazýváš win-1250 šíleným? Je standardem od roku 1996. Od iso-8859-2 se v češtině liší jen ve třech písmenech "ž", "š" a "ť".

PS: Dnes už dělám nové weby jen v utf-8.
Pokusil bych se teda překodovat tu DB na win1250 asi to dá míň práce, ale moc teda nevím jak na to. Pochopil jsem jen, že se to nedá aplikovat zvlášť na jednotlivé tabulky ale musí se to asi na práznou DB nebo co? Export bez kódování jsem tam taky nenašel.
Asi su truhla ale nějak se mě to nedaří. Doufám že nikoho nenaštvu když se tu polopaticky zkusím ještě zeptat zeptat.

Stránky kde se mě vypisuje obsah db mám ...charset=windows-1250">
na stránce kde se vyplňuje formulář mám ...charset=windows-1250">
na v souboru php.který se pomocí fomruláře spustí a provádí se insert do DB nemámá žádný kódování

Teď DB když se přihlásím do PHP admina mám v pravo :

Language: Czech cs-UTF-8 - nejde vybrat cs1250
Znaková sada připojení k MySQL: utf8_general_ci

TAbulky:

porovnání tabulek: latin2_cs
text typu: latin_2_cs
typ: MyISAM

Problém je, že když to chcu všechno předělat na (windows-1250, cp1250_czech)
udělálm to v DB ve znakové sadě k připojení MySQL, porovnání tabulek nastavím na cp1250_czech_cs, tabulku přepíšu aby byla typu CS1250 nebo vytvořím novou a vkládám do ní nová data, tak jse mi na výstupu na stránkách nezobrazují zase všechny znaky. Změnu chcem protože, ve stávajícím nastavení to zobrazuje, ale když přímo v DB něco přepíšu a uložím tak na výstupu to ty znaky nevypisuje taky. Pro zajímavost když jsem na stránky na výstupu dal ...charset=UTF_8"> tak mi to také nevypisovalo správně ba ještě hůř.

Chcem přenastavit DB na (cp1250,windows-1250)

Vím, že jsem uplně blbej a nerozumím tomu, ale jestli je někdo ochotnej mi pomoct budu mu vděčný.
$a = "";
$b = "";
$file = 'itf-utf8.sql';


//cz.php.net/exec
$command = 'whereis mysqldump';
//latin1,utf8,cp1250
//$command = "/usr/bin/mysqldump --host=".$SQLhost." --user=".$SQLuser." --password=".$SQLpsw." --opt ".$SQLdbname." --default-character-set=utf8 --skip-set-charset > ".$file;

$c = exec($command);
$d = shell_exec($command);
$d = shell_exec('LANG=en_US.utf-8; '.$command);

$e = passthru($command);
$f = system($command);

Zde mas priklad na prikaz a nekolik zpusobu, jak jej spustit. Nektery z nich by ti mohl fungovat. Jinak si budes muset spravne poprepinat phpmyadmina a udelat to pres nej. Nebo rucne v php :)
Wau to je rychlovka, vyzkouším.

Jinak jsem myslel když mám tu DB v tom utf8, že když přepíšu přímo na stránkách ...charset=windows-1250"> na ...charset=utf_8"> že to bude klapat ok ale to se taky neděje, naopak je to ještě horší.

Kdyby to však fungovalo, tak by to možná bylo snažší přepsat ty charsety?
Nedělám někde chybu.
=Pavel=
Nezapominej take na kodovani samotnych php skriptu - mely by ti odpovidat vsechny tri => databaze, skripty, html charsety ;)
Pavel (fotbalujezd.euweb.cz)
Jedna vec je myslet, druha vyzkouset.
Zmena kodovani stranky pouze rika, jake se ma pouzit prvni kodovani. Avsak prednost je takova:
1. uzivatel PHP header
2. server PHP default charset
3. HTML meta
Pokud mas 1 nastaveno na UTF, tak se pouzije 1.
Pokud mas 1 nenastaveno, pouzije se 2.
Pokud mas nastaveno 2 a server to odesila jako charset prohlizeci, pak se pouzije 2 a mastavenim 3 nic neudelas. Zalezi to ale tez na prohlizeci.

Mno, a pak mas nastaveni databaze jako extra.
4. SQL uzivatel pripojeni db
5. SQL server pripojeni db
6. SQL nastaveni tabulky, sloupce
A je to opet podobne. Pro pripojeni pouzije bud nic, 4,5 neni nastaveno.
Nebo, co mu nabizi server 5.
A nebo, co mu vnuti uzivatel ve 4, protoze ma tabulku nastavenou na 6 a 5 a 6 je jinak nastaveno.

Jenze, ty sice nactes data rekneme spravne v UTF-8 , ale mas nastavene META na win-1250. On uz to ale neprelouskava. Meta pouze rika, jak ma zobrazovat. Nerika, v jakem kodovani data skutecne jsou. (ale prepinanim kodovani v prohlizeci se ti v nekterem kodovani zobrazi data spravne s diakritikou. To je kodovani v jakem stranka je. Pokud to nemas prekodovane pres win a iso najednou. Pak ti zobrazuje treba spatne š a ž)
To mas to same, jako kdyz ulozis ve WIN v poznamkovem bloku s cestinou. Data jsou ulozena jako Win-1250, ale v tom souboru to neni nikde receno.
Tak nejak si muzes predstavit praci SQL4, kde se kodovani neresi, tam je jednotne iso-blabla-2, ale to nema na nic vliv. Kdyz to tam das ve win, tak se to bez kodovani nacte do win spravne. V okamziku, kdyby tam fungovalo prekodovani na iso-2, tak ti to prekoduje z win na iso-2 a pak uz to nerezkoduje nikdo :) Resp, kdyz vis jak, je to v poho.
Proti tomu to ted v databazi SQL5 nastavit pro tabulku a sloupec. Coz je lepcejsi, trosku.