Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno PHP a MySQL kódování

MySQL DB: staré tabulky se švédským kódováním textů, nové s utf8_czech_ci
Web: Windows-1250
DB -> web jsem vymyslela jak korektně zobrazovat české znaky z nových i ze starých tabulek.
Web > DB prasí češtinu z utf8_czech_ci.
Spojení s DB žádné kódování nastavované nemá.
Kódování webu nemám možnost změnit - je v souboru společném pro všechny stránky webu, k němuž nemám přístup.
Nastavit kódování v DB na cp1250 jsem taky zkoušela úplně jako první, ale pak mi to prasí znaky, které tam zapisuju přes phpMyAdmina na Linuxu.

Nepomáhá ani:

$vysledek = mysql_query("SET NAMES utf8");
$vysledek = mysql_query("SET CHARACTER SET utf8"); 	
$vysledek = mysql_query("ALTER TABLE m_kariera DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci");
$ulice = iconv("Windows-1250", "UTF-8", $ulice);

Nějaký nápad co s tím by nebyl?

Předmět Autor Datum
Nemůže být problém v chybějících apostrofech? Asi ne... Ten $vysledek= bych tam ale nepsal. mysql_q…
host 24.11.2009 22:43
host
Chybějící apostrofy nemají vliv - viz např. php.vrana.cz. Chybějící $vysledek taky nemá vliv - obojí…
Anicka 25.11.2009 07:39
Anicka
Keď máš web v kódovaní Windows-1250, tak od MySQL chceš, aby sa s tebou rozprával v rovnakom kódovan…
los 24.11.2009 23:06
los
Ne, to už jsme zkoušeli včera a zkoušela jsem to i teď. cp1250 to zprasí mnohem víc než všecko ostat…
Anicka 25.11.2009 07:41
Anicka
nedavno som riesil prevod mysql databazy z kodovania latin1 do utf8_bin samozrejme ked vo vytvorenej…
wam_Spider007 25.11.2009 09:09
wam_Spider007
Já ani nechci měnit texty v DB. V DB je hodně tabulek, pracuje se s nimi na hodně místech... Nechci…
Anicka 27.11.2009 18:40
Anicka
o ziadnej zmene textov v DB som nepisal. Pisal som, ze je mozne urobit zalohu databazy (dump). Zaloh…
wam_Spider007 30.11.2009 09:25
wam_Spider007
Ak to zprasí viac, tak to znamená, že máš v tabuľke iné kódovanie ako si myslíš. Takže tabuľku síce…
los 27.11.2009 23:44
los
Hezky si to představuješ, ale na to, že máš část DB v nějakém švédském kódování a část v UTF8-czech…
Craft 27.11.2009 23:02
Craft
Tak konverze DB s ruční korekcí nepřipadá v úvahu - má 218 tabulek. To radši u těch nových nechám ta…
Anicka 30.11.2009 09:04
Anicka
HEURÉKA!!! Funguje mi to, i když si myslíš, že je marná snaha. Stačilo napsat správné 2 řádky a dát…
Anicka 30.11.2009 17:35
Anicka
V tom článku opisuje predposledný odstavec presne tvoj prípad - stránka vo Windows-1250 a databáza v…
los 30.11.2009 23:01
los
Právě že ne. Žádné iconv nepotřebuju!!! Fakt. Se SET NAMES 'cp1250' (bez character_set_connection) t…
Anicka 01.12.2009 17:11
Anicka
Práveže som to skúšal. poslední
los 01.12.2009 20:28
los

Keď máš web v kódovaní Windows-1250, tak od MySQL chceš, aby sa s tebou rozprával v rovnakom kódovaní. Príkaz SET NAMES pre nastavenie kódovania, v ktorom komunikuješ s MySQL, by teda nemal nastavovať UTF-8, ale Windows-1250, takže by mal vyzerať takto:

SET NAMES 'cp1250'

Funkciu iconv by si už potom nemala potrebovať.

nedavno som riesil prevod mysql databazy z kodovania latin1 do utf8_bin
samozrejme ked vo vytvorenej databaze zmenim kodovanie tak to pose*ie vsetky texty. Urobil som to teda inak.
Dumpol som databazu - co vlastne vytvori TXT subor. Ten som editoval, u kazdej tabulky som nastavil spravnu collation a vsetko co k tomu patri. Po uprave som tuto databazu znovu obnovil. Tym padom som dosiahol to, ze som zmenil aj collation a aj texty ostali nezmenene.

Já ani nechci měnit texty v DB. V DB je hodně tabulek, pracuje se s nimi na hodně místech... Nechci riskovat, že když změním kódování nějakých starých textů, tak to pak přestane fungovat a ručně se mi s tím nechce přepisovat, za tu práci to nestojí.

Jediné co chci, je převést text při ukládání z Wndows-1250 (web) do české utf-8 (DB), lhostejno, zda nějakým phpkovým příkazem nebo nějakým nastavením v dB. Když to jde bez problémů opačně z DB na web, tak to přece musí jít takhle taky.

o ziadnej zmene textov v DB som nepisal. Pisal som, ze je mozne urobit zalohu databazy (dump). Zaloha sa vlastne vytvori v style textoveho suboru, kde je kodovanie spravne. Budes tam mat teda nieco taketo:

create table tabulka (
ID int auto_increment,
pole char(2) null)engine=InnoDB collate=utf8;

insert into tabulka (id, pole)
values (1, 'ahoj'), (2, 'dovi');

...

takze tento subor upravis tak, ze pri kazdej tabulke zmenis collate na tu spravnu. Taktiez mozes zmenit v global_settings nastavenia. Ak ale chces aby tieto globalne nastavenia ostali nezmenene potrebujes ich vlozit do my.ini resp. do my.cnf(v linuxe).
Ked mas cely dump upraveny tak ho restornes ako novu DB. Takze sa ti vytvori nova DB so spravnou collation a nove tabulky so spravnou collation pricom sa ti do tychto novych tabuliek nasackuju data, ktore si tam mala aj predtym.

Ak to zprasí viac, tak to znamená, že máš v tabuľke iné kódovanie ako si myslíš. Takže tabuľku síce môžeš mať nastavenú na UTF-8, ale dáta v UTF-8 nie sú. To sa mohlo stať buď zmenou kódovania už naplnenej tabuľky (tak ako písal wam_Spider007) alebo zápisom dát do tej tabuľky v inom kódovaní.

Ak si do tej databázy zapisovala raz v jednom kódovaní a raz v druhom, tak to už asi nedáš dohromady.

Hezky si to představuješ, ale na to, že máš část DB v nějakém švédském kódování a část v UTF8-czech a web používá kódování win1250 a nechceš konvertovat DB ani změnit kódování webu, tak marná jiná snaha. Ono je někdy kumšt zprovoznit i kódování UTF8, proto to mnozí řeší win1250.
Jenom můžu ujistit, že žádný php příkaz nebude schopen docílit správného zobrazování diakritiky bez ujednocení kódování jak webu, tak DB, takže pokud chceš mít diakritiku ok a to jak starých, tak nových textů budeš muset provést konverzi DB do win1250 a případně provést ruční korekci, jinak to nepůjde.

Tak konverze DB s ruční korekcí nepřipadá v úvahu - má 218 tabulek. To radši u těch nových nechám taky švédské kódování, sice to nebudu moct editovat přes phpMyAdmina a v DB to budu v phpMyAdminovi vidět s otazníkama, ale na webu to bude aspoň korektně. Ostatně, ani když v DB nastavím 1250, tak to nemohu editovat přes phpMyAdmina, protože se mi ukládají otazníky místo českých znaků. Pokud tedy opravdu neexistuje žádný způsob jak při zápisu konvertit text z jednoho kódování do jiného (pomocí iconv nebo jinak).

HEURÉKA!!! Funguje mi to, i když si myslíš, že je marná snaha. Stačilo napsat správné 2 řádky a dát je na správné místo (před insert do DB):

MySQL_Query("SET character_set_client = cp1250");
MySQL_Query("SET character_set_connection = utf8");

Celý článeček na toto téma (v češtině) je na: interval.cz.

Samozřejmě uznávám, že nejjednodušší je mít všechno ve stejném kódování a u nově dělané aplikace bych to tak určitě udělala.

V tom článku opisuje predposledný odstavec presne tvoj prípad - stránka vo Windows-1250 a databáza v UTF-8. Vyriešené to tam je normálne (SET NAMES 'cp1250').

To nastavenie character_set_connection na utf8 ti môže fungovať, ak robíš súčasne navyše tú konverziu pomocou iconv. Keby si ale použila hneď na začiatku SET NAMES 'cp1250', tak by si nepotrebovala zbytočne používať iconv. Ale načo robiť veci jednoducho...

Právě že ne. Žádné iconv nepotřebuju!!! Fakt. Se SET NAMES 'cp1250' (bez character_set_connection) to nefungovalo, to jsme zkoušeli hned na začátku. Musí tam být jak SET NAMES, tak character_set_connection. Jestli mi to nevěříš, můžeš si to zkusit sám, odhaduju, že Ti to zabere cca 15 minut.

Zpět do poradny Odpovědět na původní otázku Nahoru