Prolbém s kódování

Ahoj, potřeboval bych poradit s kódováním.

Testuju to na localhostu kde mám
PHP 4.4
Apache 2.054
MySQL 4.1.13a (v my.ini je default kódování latin1)
phpMyAdmin 2.6.3pl1

Původně jsem chtěl kódování iso-8859-2, ale když jsem zjistil, že mám problém s cp1250 tak bych potřeboval poradit, kde dělám něco špatně.
Takže, mám
-vytvořenou tabulku (bez nastavení kódování),
-script (jako soubor) je v kódování cp1250
-hlavičku mám nastavenou "header("Content-Type: text/html; charset=cp1250");"

Když si vložím data do tabulky, tak se uloží i zobrazí správně. Problém je ale v tom, že když volám nastaví kódování
mysql_query("SET CHARACTER SET cp1250");

a poté vložím do tabulky "ěščřžýáíé" tak si mi vypíše (při dalším načtení) "?š?žýáíé".

Poradíte mi prosím, kde dělám chybu. Díky.
set character set cp1250 je označení kódování pro klienta, tedy převádí to, co je v db na 1250.
Jak píšeš std kódování v MySQL je iso 8859-1, které nejspíš něco jako ě a č neobsahuje. Tak tam jsou ty otazníky.
Při zakládání tabulky zkus určit kódování. Ještě je celkem důležité určit pro kterou zemi to je kvůli řazení (Character set 'latin2' collation 'CZ' .. nebo něco takového, viz manuál.
Pak by to nemělo dělat problémy.
Musíš prostě zajistit, aby SQL znal odpovídající znaky z 1250 v kódování, které má nastavené u tabulek. Nejlépe stejné jako je skript...
tak už fakt nevím. na cp1250 se vykašlu (stejnak to "není" kódování) a udělám to v klasickém iso-8859-2 (latin2).

* takže verze a nastavení apache, mysql... zůstavají

* v mhpMyAdmin vidím na úvodní stránce...
Language: Czech (cs-uft-8)
Znaková sada v MySQL: UTF-8 Unicode (utf8)
Znaková sada připojení k MySQL: uft8_general_ci

* vytvářím databázi i tabulku s následujícím kódováním...

mysql_query("CREATE DATABASE " . $Databaze_rs . " Character set 'latin2' collate 'latin2_general_ci'") or die(mysql_error());

$sql="CREATE TABLE " . $Tabulka_rs . " ("
....
") Character set 'latin2' collate 'latin2_general_ci';";
mysql_query($sql) or die(mysql_error());

[pozn. na localhostu se mi vytvoří tabulka bez problémů, ale tady na wz, mi vyhodí tuto chybu: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''latin2' collate 'latin2_general_ci'' at line 1]

* script stránky má hlavičku nastavenou na...

header("Content-Type: text/html; charset=latin2");
resp. meta tag na
<meta http-equiv="content-type" content="text/html;charset=iso-8859-2" />

* po připojení nastavuju...

mysql_query("SET CHARACTER SET latin2");


a když zadám (na localhostu) "ěščřžýáíé" tak se mi uloží "?ýáíé" a vypíše "?ýáíé".

Nemám chybu v nastavení kódování tabulky, když mi to doma na localhostu jde a tady ne? Díky moc za radu.
u předposledního řádku mého minulého příspěvku se sem do fóra nevložily všechny otazníky, takže těch otazníků tam má být 5 (ě ... ž)
prováděl jsem testy, protože jsem to chtěl taky vědět, a zjistil jsem:
mysql_query("SET CHARACTER SET latin2");
^^^ pokud máš klienta nastaveného na utf, tak by tam mělo být asi správně nějaké utf kódování... tohle nastavuje kódování klienta...

taky jsem to prověřoval na localhostu (win) a na wz. Na wz je zřejmě starší MySQL a tyhle věci jsou nastavené globálně pro celé MySQL. (dohad)

Koukám, že s největší pravděpodobností tahle verze (na wz) vůbec nepodporuje nastavení znakové sady u tabulek.

Na co jsem došel:
na wz funguje čeština bez problémů (mám nastaveného klienta na iso). Php je na iso std. Vkládání, vybírání a řazení funguje.

na localhostu (win):
mám mysql 4.1.13, to umí nastavit znakovou sadu u tabulky, jak píšeš výš, ale zase je skompilované bůhví jak a blbě řadí.

Dá se z toho něco použít?
> prováděl jsem testy, protože jsem to chtěl taky vědět, a zjistil jsem
nejprve ti chci poděkovat za pomoc a čas který do mě investuješ. takže díky.

> pokud máš klienta nastaveného na utf, tak by tam mělo být asi správně > nějaké utf kódování... tohle nastavuje kódování klienta...

proč myslíš že by měl být prohlížeč nastaven na UTF když používám iso? jinak používám Operu 8.02 a kódování mám na automatický. Vypsalo se to stejně i když jsem nastavil iso nebo cp1250, ale pod utf to vypsalo jinak. pak jsem zkoušel explorery a tam je výseldek stejný jako u Opery.

> taky jsem to prověřoval na localhostu (win) a na wz.
> Na wz je zřejmě starší MySQL a tyhle věci jsou nastavené
> globálně pro celé MySQL. (dohad) Koukám, že s největší
> pravděpodobností tahle verze (na wz) vůbec nepodporuje
> nastavení znakové sady u tabulek.

jj, taky jsem to už někde slyšel. Ta stará verze neumožňuje nastavení kódování jednotlivých tabulek a buněk už vůbec ne.
Ostatně to dokazuje jak už jsem psal:
na localhostu se mi vytvoří tabulka bez problémů, ale tady na wz, mi vyhodí tuto chybu: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''latin2' collate 'latin2_general_ci'' at line 1

> Na co jsem došel:
> na wz funguje čeština bez problémů (mám nastaveného klienta na iso).
> Php je na iso std. Vkládání, vybírání a řazení funguje.

jo, vypada že jo.

Tak napsal jsem krátkej kód na otestování, vkládání už funguje, nevím, asi jsem musel někde dělat nějakou chybu. A nastal problém s exportem tabulky její následné importování na wz. Takže zde je kód:

--------------------------------------------------------------------------------------------
<?php
// Nastavujeme kodovani stranky
header("Content-Type: text/html; charset=latin2");

$SQL_Server = "localhost";
$SQL_Uzivatel = "root";
$SQL_Heslo = "";
$Databaze = "db";
$Tabulka = "tab";

// Pripojujeme se k kerveru
$Pripojeni = mysql_connect($SQL_Server,$SQL_Uzivatel,$SQL_Heslo) or die(mysql_error());

// Testujeme zda existuje databaze. Zda-li ne, tak ji vytvorime.
// POZOR: Pokud databaze existuje, ale tabulka ne, tak se nova tabulka nevytvori.
if (!mysql_select_db($Databaze))
{
// Vytvarime databazi.
mysql_query("CREATE DATABASE " . $Databaze . " Character set 'latin2' collate 'latin2_general_ci'") or die(mysql_error());
mysql_select_db($Databaze) or die(mysql_error());
}

// Vytvarime tabulku
$sql="CREATE TABLE " . $Tabulka . " ("
."`id` INT NOT NULL AUTO_INCREMENT ,"
."`jmeno` TEXT NOT NULL ,"
."`prijmeni` TEXT NOT NULL ,"
."PRIMARY KEY ( `id` ) "
.");";
// Nasledujici radek vypise na wz chybu
//.") Character set 'latin2' collate 'latin2_general_ci';";
mysql_query($sql) or die(mysql_error());

// Nastavujeme znakovou sadu
mysql_query("SET CHARACTER SET latin2");

// Vkladame data
$sql = "INSERT INTO " . $Tabulka . " (jmeno, prijmeni) VALUES ('ěščřžýáí', 'test')";
mysql_query($sql) or die (mysql_error());

// Nacteme data z tabulky, ktere nasledne vypiseme
$sql_query = mysql_query("SELECT * FROM " . $Tabulka);
while( $Data = MySQL_Fetch_Array($sql_query) )
echo "<br/>Jmeno: <b>'" . $Data['jmeno'] . "'</b> Prijmeni: <b>'" . $Data['prijmeni'] . "'</b>";

// Ukoncujeme spojeni se serverem
MySQL_Close($Pripojeni);
?>
--------------------------------------------------------------------------------------------

* doma na localhost se tabulka vytvoří, tady na wz mi vyhodí chybu:
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''latin2' collate 'latin2_general_ci'' at line 1

Jestli by se tato chyba zobrazila i kvůli vytváření databáze nevím, protože na wz databáze vyvářet nejdou.

* na obrazovce na localhostu se vypise "Jmeno: 'ěščřžýáí' Prijmeni: 'test'" což je správně.
tabulku si vyexportuji do souboru (klasicky bez nějakého specifického nastavení)

vygenerovaný soubor vypadá následovně:
-------------------------------------------------------------------------------------------
-- phpMyAdmin SQL Dump
-- version 2.6.3-pl1
-- http://www.phpmyadmin.net
--
-- PoÄŤĂ­taÄŤ: localhost
-- VygenerovĂĄno: ĂšterĂ˝ 23. srpna 2005, 17:38
-- Verze MySQL: 4.1.13
-- Verze PHP: 4.4.0
--
-- DatabĂĄze: `db`
--
-- --------------------------------------------------------
--
-- Struktura tabulky `tab`
--
CREATE TABLE `tab` (
`id` int(11) NOT NULL auto_increment,
`jmeno` text NOT NULL,
`prijmeni` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ;
--
-- Vypisuji data pro tabulku `tab`
--
INSERT INTO `tab` VALUES (1, 'ěťčřŞýåí', 'test');
--------------------------------------------------------------------------------------------

zaráží mě hlavně poslední řádek, (ěťčřŞýåí) co to proboha je?

Když si tabulku na localhstu smažu a naimportuju ze souboru, tak to proběhne úspěšně a i data jsou čitelé:
--------------------------------------------------------------------------------------------
-- phpMyAdmin SQL Dump
-- version 2.6.3-pl1
-- http://www.phpmyadmin.net
--
-- Počítač: localhost
-- Vygenerováno: Úterý 23. srpna 2005, 17:38
-- Verze MySQL: 4.1.13
-- Verze PHP: 4.4.0
--
-- Databáze: `db`
--
-- --------------------------------------------------------
--
-- Struktura tabulky `tab`
--
CREATE TABLE `tab` (
`id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`jmeno` text NOT NULL ,
`prijmeni` text NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB DEFAULT CHARSET = latin2 AUTO_INCREMENT =2;# MySQL vrátil prázdný výsledek (tj. nulový počet řádků).
--
-- Vypisuji data pro tabulku `tab`
--
INSERT INTO `tab`
VALUES ( 1, 'ěščřžýáí', 'test' ) ;# Ovlivněné řádky:1
--------------------------------------------------------------------------------------------

Problém ale nastane, když si chci naimportovat tuto tabulku na wz.
Nejprve mi to vyhodí následující chybu:

--------------------------------------------------------------------------------------------
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT CHARSET=latin2 AUTO_INCREMENT=2' at line 24
--------------------------------------------------------------------------------------------

Tady jde o to, že mysql na wz nezna nastavení kódování u tabulek, tak tuto část řádku v souboru smažu.

Nahradím tedy
CREATE TABLE `tab` (
`id` int(11) NOT NULL auto_increment,
`jmeno` text NOT NULL,
`prijmeni` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ;

za

CREATE TABLE `tab` (
`id` int(11) NOT NULL auto_increment,
`jmeno` text NOT NULL,
`prijmeni` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 ;

(změnil jsem posldní řádek)

Zkusím import znovu. Nyní to proběhne úspěšně, ale je to nečitelné. Vypíše se mi toto:

--------------------------------------------------------------------------------------------
SQL-dotaz:
-- phpMyAdmin SQL Dump
-- version 2.6.3-pl1
-- http://www.phpmyadmin.net
--
-- PoÄŤĂtaÄŤ: localhost
-- VygenerovĂĄno: ĂšterĂ˝ 23. srpna 2005, 17:38
-- Verze MySQL: 4.1.13
-- Verze PHP: 4.4.0
--
-- DatabĂĄze: `db`
--
-- --------------------------------------------------------
--
-- Struktura tabulky `tab`
--
CREATE TABLE `tab` (
`id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`jmeno` text NOT NULL ,
`prijmeni` text NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB AUTO_INCREMENT =2;# MySQL vrátil prázdný výsledek (tj. nulový počet řádků).
--
-- Vypisuji data pro tabulku `tab`
--
INSERT INTO `tab`
VALUES ( 1, 'Ä?ĹĄÄŤĹ?ŞýåĂ', 'test' ) ;# Ovlivněné řádky:1
--------------------------------------------------------------------------------------------

zde je vidět, že se načetly chybné data, v tabulce jsou chybé data.

Po zavolání scriptu se vypíší data (první řádek jsou nainportovaná data), duhý řádek jsou nově vložený text, což je důkaz, že script na wz funguje.

Jmeno: 'Ä?ĹĄÄŤĹ?ŞýåĂ' Prijmeni: 'test'
Jmeno: 'ěščřžýáí' Prijmeni: 'test'

Takže script na localhostu i na wz funguje. Problém nastane tehdy, když chci z localhostu vyexporotvat tabulku (špatně čitelné) a nainportovat zde na wz.

Vyexportovanou databázi i se scriptem si můžeš stáhnout zde http://www.ucimsedelatweb.wz.cz/test.rar

Takže prosím dokážeš mi s tím MzM pomoci, nebo někdo jiný?
Díky.
Uff. Tak mám snad řešení s importem zálohy...

Popis porblému:
Export databáze phpMyAdminem (2.6.3 pl1) na localhostu (dále jen lc) je nečitelný po importě na wz z důvodu kódování. phpMyAdmin kóduje do UTF-8, jenže phpMyAdmin na wz očekává něco jiného (latin2).

Shrnutí problému:
1) Načíst lze na localhostu bez problémů s importem nastaveným na utf-8.
2) Načíst nelze na wz bez problémů. Špatné kódování.

Zde je můj návrh řešení importu databáze na wz, která byla vygenerována na localhostu:

Vzhledem k tomu, že data jsem vkládal v ISO-8859-2 (latin2) tak je musím překonvertovat do tohoto formátu. Bude nám k tomu stačit PSpad (já jsem to testoval na 4.3.3 build 2092, což je stabilní verze).

Tak jdeme na to:
0) Data musela být ukládána v kódování ISO-8859-2 (latin2). (Možná to funguje s jiným, ale nezkoušel jsem.)
1) Vygeneruj na localhostu databázi do souboru sql.
2) - vytvoř prázdný txt soubor a otevři jej v PSpadu.
- nastav kódování na UTF-8 (Formát->UTF-8)
- soubor ulož
- PSpad ukonči.
3) - vygenerovanou databázi otevři v PSpadu (měly by být čitelné znaky a mělo by být nastaveno kódování na UTF-8 (můžeš se o tom přesvědčit tak, že dole na stavové liště uvidíš "Kódvání: UTF-8")).
- změň kódování na ISO-8859-2 (Formát->ISO-8859-2).
- soubor ulož
- PSpad zavři.
4) - Jdi do phpMyAdmina
- naimportuj soubor s databází (záložka SQL) - (Pokud používáš verzi admina, kde si můžeš nastavit kódování importovaného souboru, tak si zvol "latin2 resp. iso-8859-2". )
5) A je hotovo :)

Mnohem jednodušší by bylo, kdyby v phpMyAdminovi existoval listbox, kde bych si mohl vybrat, v jakém kódování chci mít vyexportovaný soubor s databází (stejně jako u importu). nevíte zda existuje nějaká možnost, jak to v adminovi nastavit? díky.
Kdo to má číst... :-)
s tím UTF-8 jsem to myslel tak, že když přistupuješ k db přes admina, který má nastavené utf, tak by o tom měla db vědět. Jinak ze skritpu je to asi iso.

A kódování admina se dá, podle mě, vybrat hned na začátku při přihlašování, tak klidně vyber iso, ne utf... Aspoň já to tak dělám a nemám s tím problém..
Co se týče kódování admina, tak na začátu mám na výběr
* Language - zde si nastavuji jazyk komunikace programu se mnou (vše v utf)
* Znaková sada v MySQL: zde je na tvrdo nastaveno UTF-8 Unicode (utf8)
* Znaková sada připojení k MySQL: tady si mohu nastavit vstupní kódování. Co jsem se díval do helpu http://dev.mysql.com/doc/mysql/en/charset-connection.html tak to je něco jako defautní nastavení, ale když používám ve scriptu mysql_query("SET CHARACTER SET latin2"); tak toto volání má větší prioritu. Z toho plyne, že nastavuje ji-li člověk CHARACTER SET ve scriptu, nemusí jej nastavovat na té vodní obrazovce. (Alespoň mám z toho takový pocit, co jsem testoval).

Takže závěr je takový. Ve scriptu stačí před voláním příkazu zavolat CHARACTER SET. Jediné co musím na localhostu udělat, je u vytvářené databáze (ne tabulky) nastavit její kódování na Character set 'latin2' collate 'latin2_general_ci'. Na wz tato nutnost odpadá asi z důvodu toho (ostatně jak jsi psal výše), že to bude mít wz nastaveno default. Tabulky se nemusí nastavovat, protože pokud používají stejné kodování jako databáze tak je to asi zbytečné. A stejnak na wz tato možnost není (z důvodu staré verze MySQL).

Třeba se tyto poznatky (maximálně tak začátečníkovi :) ) budou někomu hodit.

Jenom by mě zajímalo, jak nastavit kódování exportované databáze do sql souboru. Protože phpmyadmin 2.6.3pl1 to automaticky konvertuje do UTF-8, což je pro mě zbytečné, když používám ISO.
Konvertidlo... Nebo editor, co to umi nacist v utf a ulozit v iso (PSPad ?). Ja na to mam JEdit.
Jo fakt PSPad to tumí. Ale nebráním se zkusit něco lepšího ;) tak jsem si stáhl (windows stab. verzi) a nainstaloval. trochu mi vadí že to je Javovská app (kvůli rychlosti), ale nebudu soudit předem.
Otevřel jsem v něm soubor v UTF-8 (musel jsem si ale předtím v nastavení nastavit UTF-8), ale zobrazuje se to špatně. No, neva zkusím si s tím ještě pohrát.

V každém případě řešení prozatím na převod mám (PSPad), takže zase mě tak nic moc netlačí.

A co se týče češtiny jako takové, tak ji asi začnu nenávidět ;) Zlaté UTF, škoda že není všude tak dobře podporováno :(