Autor Zpráva
martin1312
Profil
Zdravím,

rieším problém. Pri presune hostingu (spolu s DB) na iný, sa zmrzačila diakritika. Znaky sú však zle uložené už v databáze, ale na starom hostingu sa vypisovala na webe dobre.
V DB sú uložené napríklad:
Služby (= Služby)
Vymeň (=Vymeň)
Kariéra (=Kariéra)
v Trenčíne (=v Trenčíne)

Kódovanie stĺpcov je utf8_unicode_ci
Pri pripájaní k DB v PHP mám:
$dbc->query("SET NAMES 'utf8'");
$dbc->query("SET CHARACTER SET utf8");
$dbc->set_charset("utf8");
Súbor je v utf8, tak isto aj meta charset.

Viete mi pomôcť, čo upraviť, aby sa znaky vypisovali korektne?
Vec, kt. nerozumiem, prečo sa na starom hostingu vypisovali znaky dobre aj keď v DB boli uložené rovnako, ako sú teraz? Môže to byť verziou MySQL databázy?

Poznámka: ak vložím manuálne do DB znaky čťžýáí... vypisujú sa dobre. Ide mi teda o to, aby sa "dobre" vypisovali aj tie "škaredé" znaky. Chcel by som sa vyhnúť prepisu dát v DB.

Ďakujem za všetky rady.
Kajman
Profil
Máte ještě možnost připojit se přes adminer do databáze na původním hostingu? Pokud je v něm diakritika v pořádku, zkuste přes adminer i export dat a import na novém stroji.
martin1312
Profil
To žiaľ nepôjde, mám prístup iba do starej databázy (aj s pôvodnými dátami), na adminer by som potreboval aj FTP.
Ale aj v phpmyadmin sa zobrazujú tie zlé znaky, je medzi ním a adminerom nejaký rozdiel (v interpretácií znakov)?
_es
Profil
martin1312:
Možno boli dáta zle uložené aj na starom hostingu, no tak, že sa nakoniec zobrazovali správne. Skús namiesto UTF8 v tých troch príkazoch v [#1] nastaviť nejaké 8bitové kódovanie, či sa potom nezobrazia (na stránke) správne.
Kajman
Profil
martin1312:
Máte tedy již zdrojová data v nepořádku.

Zkuste tedy v tom pma export s nastavením
Znaková sada souboru: iso-8859-1

Na výsledný uložený soubor se podívejte, zda je v utf-8, pokud ano, na začátku toho souboru by mělo být něco jako
/*!40101 SET NAMES latin1 */;
v tom zaměňte latin1 za utf8 a zkuste naimportovat na nový stroj.

_es:
Tím se souvisejících problémů nezbaví.
martin1312
Profil
_es, Kajman:
áno, o tom som písal v prvom príspevku, že sú zle uložené pôvodné dáta, ale zobrazovali sa dobre. Problém sa prejavil až po prechode na iný hosting.

Kajman:
Ďakujem za radu, vyskúšam.


Kajman:
takže to nepomohlo, zlé znaky sa zmenili na trošku iné:

pôvodne:
Hrubá stavba montovaného domu

po zmene latin1 na utf8 a importe:
Hrubá stavba montovaného domu



_es:
vyskúšal som utf8 nahradiť za latin1, čiastočne to pomohlo, väčšina textov s diakritikou sa už zobrazuje dobre, ale občas sa vyskytnú otázniky:
Naša spoloÄ�nost
_es
Profil
martin1312:
vyskúšal som utf8 nahradiť za latin1
To bolo rada len na analyzovanie problému, (viď [#5] Kajman), nie na jeho vyriešenie. Bude treba dáta nejako opraviť, aby boli v databáze uložené správne.
martin1312
Profil
_es:
Viem, že len na analyzovanie. O to opravenie ide aj mne, len neviem ako.
_es
Profil
martin1312:
Vyskúšaj nastaviť latin2 alebo cp1250.
peta
Profil
martin1312:
Mas zalohu db v txt souboru nebo zipu? Bylo by fajn dat na nej link, at muzeme zjistit v jakem je kodovani.

U starych mysql se pouziva latin1 nebo cesi cp1250, pokud db umi kodovani. Tudiz ten soubor je v tomhle kodovani. Pokud pro ukladani pouzivas php program, tak je treba pouzit SET NAMES s latin1 (pokud je latin1). To znamena, ze data posilas v latin1. V tabulce muzes mit zadane utf8, on si to pak spravne prekoduje z latin1 do ut8 a ulozi do tabulky.

Horsi pripad je ten, kdy mas puvodni tabulku treba v utf8 (db podporuje kodovani), ale data do ni ukladas z php heder nastavene na utf8 pres latin1 (nebo cp1250). To pak je spatne nakodovane v te tabulce. Spravny export je pak pres latin1. Jakekoliv jine kodovani pri exportu nenavratne znici kodovani.

"Ale aj v phpmyadmin sa zobrazujú tie zlé znaky"
To presne napovida tomu horsimu pripadu, ze to tam program souka ve spatnem kodovani. Pro export budes urcite potrebovat nahrat program, ktery to exportuje spravne. Nevim, zda zrovna phpmyadmin to dokaze. ale je mozne, ze kdyz kliknes export a nastavis spravne kodovani, tak to exportuje. Bude tvrdit, ze je tam kodovani to a to (mysql set names). Ale pri importu pouzijes kodovani, ktere ma stara stranka (v prohlizeci se podivas na kodovani Zobrazeni - znakova sada nebo zkouknes hlavicku stranku v nastroji pro cteni hlavicek)
Sak dej link na puvodni web, z te stranky pujde mozna zjistit, jake pouziva kodovani stranka. Pak bude treba zjistit, jake prikazy pouziva mysql.
phpmyadmin zobrazuje data v kodovani, ktere mu navolis. Kdyz zvolis utf, tak ti zmeni i SET NAMES. Jenze, pokud jsou data ulozeny v jinem kodovani nez ma byt spravne podle kodovani tabulky, tak ti to prekoduje do kodovani stranky, zmrsi. Tezko se to vysvetluje, mozna to nechapes, tak si z toho nic nedelej :)
---
Jeste to zkusim jinak, takovy priklad.
Stranku mas nastavenou php header treba win-1250. Mysql SET NAMES je nastavene na latin2. A v tabulce v db mas nastavene UTF-8. Takze on veme spravnou cestinu win-1250, kterou povazuje za latin2 pro set names a on ti to prekoduje jako by kodoval latin2 do utf-8.
Cili, v db je ve skutecnosti win-1250 chybna povazovane za latin1, prekodovane do utf-8.
Spravne to tez ziskas zpet, kdyz budes mit set names latin2 jako v puvodnim kodu, ale php header win-1250, jako v puvodni strance.

Proc tomu tak je?
U mysql mene 4.2 nemaji podporu kodovani, takze ukladaji vse v latin1. Kdyz to ukladas ze stranky s win-1250, tak to potom neni latin1, ale win-1250. Nicmene export ti bude tvrdit, ze jde o latin1. Pri importu si to musis pohlidat a importovat to pres win-1250.
U 4.2 a vice je prave ten horsi pripad.
martin1312
Profil
peta:
Vďaka za obsiahlu odpoveď.
Zalohu DB tu môžem dať, ale neviem, s akým kódovaním ju mám exportovať, aby to bolo pôvodné kódovanie.

Podľa tvojho opisu usudzujem, že sa jedná o ten horší prípad. Ale problém je, že neviem určiť, v akom kódovaní sa pôvodne ukladali do DB záznamy (cez PHP), pretože v PHP pri pripojení k DB nebolo špecifikované kódovanie pripojenia, to v [#1] som pridal až ja.
Ešte treba povedať, že ja som bol iba požiadaný o vyriešenie problému s kódovaním po presune na nový hosting, nemám prístup k starému hostingu, iba ku starej databáze. Tak isto web ide z nového hostingu - http://nizkoenergeticke-domy-na-kluc.sk/sk/O-nas/ - teraz je pripojenie k DB na latin1.

Skúsim sa pohrať s kódovaním pri exporte a importe a dám vedieť...
Kajman
Profil
martin1312:

Zkuste se podívat do vyexportované zálohy s použití té volby latin1 (defaultní volba, pokud nebylo dříve určeno kódování použité pro spojení) zda je to v nějakém běžném kódování češtiny ... latin2, cp1250, utf8. Případně zkuste na tom sql souboru jednoduše udělat pár náhrad chybných znaků za správné a až opravený sql importuje, také to tak pár lidí tady už vyřešilo.
martin1312
Profil
Kajman:
Takže exportovaná databáza s nastavením exportu na latin1 (iso 8859-1) je v kódovaní cp1250. Ak .sql súbor otvorím v editore (napr. PSpad), obsahuje tie "škaredé" znaky, na webe sa však interpretujú skoro dobre (vďaka kódovaniu spojenia na latin1), pri zbežnom pohľade som našiel iba pár znakov, kt. sa stále zobrazujú zle:
Ä� = č
ĺ = ľ
ž = ž
Å¥ = ť
ň = ň

to už nie je problém nechať nahradiť. Ale vŕta mi v hlave, odkiaľ sa tam vzali, zdá sa mi, ako keby boli ešte v ďalšom inom kódovaní (nie utf8 ani iso 8859-1).
peta
Profil
http://nizkoenergeticke-domy-na-kluc.sk/sk/O-nas/
To je utf-8, kodovani stranky.

"Ale problém je, že neviem určiť, v akom kódovaní sa pôvodne ukladali do DB záznamy (cez PHP), pretože v PHP pri pripojení k DB nebolo špecifikované kódovanie pripojenia,"
Tady potrebujes 2 veci. Kodovani, ktere je na strance a to pripojeni. Kdyz neni definovane SET NAMES, tak si spust phpinfo nebo phpmyadmina, tam by se to melo dat zjistit, jake je default nastaveni serveru nebo se zeptej admina. Pripadne zjisti tez verze php/sql, abys vedel, co muzes ocekavat.
Pokud mas export soubor *.sql z puvodni db, tak ho dej sem.
Kdyz otevres utf-8 v beznem editoru ve win a nereknes mu kodovani, tak ti zobrazi presne takove skarede znaky, protoze to otevre jakoby to melo kodovani win-1250.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: