Autor | Zpráva | ||
---|---|---|---|
Priapos Profil |
#1 · Zasláno: 28. 10. 2012, 20:16:46
Zdravím.
Moc prosím o radu. Přečetl jsem kilometr článků a vyzkoušel asi všechny návody dostupné na phpbb.cz ale pořád se mi nedaří převést obsah databáze phpbb2 na trojku. Fórum běželo před pěti lety (pak jsem ho dostranil) na wz.cz na cp1250/latin2_czech_cs/Windows-1250. To fórum jsem tam znovu nainstaloval pro případ že by se převod povedl na wz ale to byla utopie - tam se dneska povede nic (odezva asi dvě a půl hodiny). Fórum ale běží se správnými znaky. Podle návodu jsem ho hodil na nový hosting www.forum-podvody.cz a tak taky celkem běží. Chci ale samozřejmě přejít na trojku a to je kámen úrazu. Všechny návody které se dají na foru najít selhávají. Zkoušel jsem přepis lang_main.php před převodem, zkoušel jsem vyexportovat ze stare db, převádět v PsPadu a importovat do nové db (skončí failem při impotru) v utf a nic nepomáhá. Prosím o pomoc jak to udělat aby se to povedlo. Staré fórum běží na Windows-1250, porovnávání latin2_czech_cs. Trojka už nemá variantu pro Windows-1250, takže se to musí převést, ale implementovaný převaděč to nezkousne - buď faily při převádění nebo typicky rozhozená grafika. Díky |
||
Kajman Profil |
#2 · Zasláno: 28. 10. 2012, 21:17:52
Když se podíváte do běžící staré databáze např. adminerem, tak tam je tam diakritika v pořádku?
|
||
Priapos Profil |
#3 · Zasláno: 29. 10. 2012, 08:38:55
Kajman:
Když se kouknu přímo do phpmyadminu tak jsou taky otazníky ale to jsem měl vždy a všude. Weby pak zobrazují znaky korektně. Potřebuji prostě přijít na to jak převést obsah tabulek do utf a nějak se mi to nedaří. Podle jednoho návodu jsem zkoušel převést v PsPadu ale ani se to nepovedlo naimportovat. |
||
Kajman Profil |
#4 · Zasláno: 29. 10. 2012, 08:55:15
Priapos:
„tak jsou taky otazníky“ V tom může být zdroj problémů. Nejdříve si opravte současnou databázi tak, aby souhlasila nastavená znaková sada s uloženými daty. Tedy aby v admineru nebo v pma byla diakritika v pořádku. Na převod (raději na testovacích datech) můžete použít např. http://php.vrana.cz/prevod-kodovani-mysql.php (nebo upravenou verzi, kde se nepředávájí parametry z příkazové řádky - jen si nastavte collation na některé s cp1250). |
||
Priapos Profil |
Díky. Zkusím štěstí
Bohužel chyba při převodu. Na tomhle se mi to vždy zaseklo při pokusu o import db po převedení v PsPadu: Chyba ALTER TABLE phpbb_kb_wordlist MODIFY word_text varchar( 50 ) COLLATE utf8_czech_ci; MySQL hlásí: Dokumentace #1062 - Duplicate entry 'domů' for key 'PRIMARY' Ještě zkusím odstranit zbytečné tabulky, které nejsou v základu phpbb2 - měl jsem na tom fóru portál a pytel různých módů. |
||
Kajman Profil |
#6 · Zasláno: 29. 10. 2012, 10:27:18
A když si zkusíte ty alery jen na nějaké jedné tabulce, kde chybu nezahlásí, tak je již diakritika v pma v pořádku?
Pokud tam byla data ukládána ve windows-1250, převádějete nejprve na cp1250, ať se db dá do pořádku! Pokud to nepůjde s porovnáním cp1250_czech_cs zkuste dočasně cp1250_bin. Jinak si ten převodní skript můžete upravit tak, aby konvertoval jen tabulky s prefixem phpbb, ať nemusíte ostatní mazat. |
||
Priapos Profil |
#7 · Zasláno: 29. 10. 2012, 10:35:31 · Upravil/a: Priapos
Po odstranění zbytečných tabulek (47) převod proběhne ale bohužel nepomůže. Naopak, všechny znaky, které se nacházejí za "ř,č" to úplně odstraní - v podstatě data pryč.
Tohle asi také nebude cesta. Už uvažuju, že se vykašlu na trojku a zůstanu na phpbb2. Kajman: „Pokud tam byla data ukládána ve windows-1250, převádějete nejprve na cp1250, ať se db dá do pořádku! Pokud to nepůjde s porovnáním cp1250_czech_cs zkuste dočasně cp1250_bin.“ Díky, zkusím |
||
Kajman Profil |
#8 · Zasláno: 29. 10. 2012, 10:58:05
A jaké porovnání vlastně máte u sloupců původních tabulek?
|
||
Priapos Profil |
Web www.registr.xf.cz běží na Windows-1250, porovnání databáze a tabulke je latin2_czech_cs. Po přihlášení je nastaveno
Language : Czech (cs-utf-8) Znaková sada připojení k MySQL: utf8_bin. Myslím, že před pěti lety tam byly znakové sady Windows-1250, ale je to dlouho. Možná že ten problém je v tomto Porovnání sloupců ani nevím, zkusím to najít ale je to onervy, odezva asi tak 10 minut. Všude je latin2_czech_cs Divné je, že mi občas pma vyhodí v levém okně po vstupu místo seznamu tabulek vyhodí error SQL-dotaz: SELECT `comment` FROM `pma_column_info` WHERE CONVERT( db_name USING utf8 ) = 'registr' AND CONVERT( table_name USING utf8 ) = '' AND CONVERT( column_name USING utf8 ) = '(db_comment)' MySQL hlásí: #2006 - MySQL server has gone away Nerad se ptám na každou věc ale nejsem programátor (ten by tu neprudil) a tohle potřebuji vyřešit. Našel jsem fci, se kterou se dá zjistit v jakém kódování byly uloženy posty (tedy myslím) a použil jí takhle: function autoUTF($s) { if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s)) { // detect UTF-8 $back = "UTF-8"; return $back; } elseif (preg_match('#[\x7F-\x9F\xBC]#', $s)) { // detect WINDOWS-1250 $back = "WINDOWS-1250"; return $back; } else { // ISO-8859-2 $back = "ISO-8859-2"; return $back; } } $vysl = mysql_query("SELECT post_id,post_subject,post_text FROM phpbb_posts_text LIMIT 100"); while($v=mysql_fetch_assoc($vysl)) { echo autoUTF($v["post_text"])." :: ".$v["post_text"]."<br><br>"; } To bude asi použitými znakovými sadami prohlížečů při odesílání postů? Je třeba tohle taky srovnat? Pokud je to spolehlivá detekce tak by bylo možné pomocí iconv texty převést do utf? |
||
Kajman Profil |
Pokud jste měl web ve windows-1250 kódování, sloupečky byly v latin2 a podle všeho nebylo nastavené kódování připojení - a tedy se použilo výchozí latin1. Bude potřeba provést postupně víc
Převod do latin1 Převod do binary Převod do cp1250 (Odkázaný skript řeší až poslední dva kroky). Ten první tu kdysi někdo zkoušel přidávat, skript není optimální a dělá zbytečné převody, ale mohl by ve Vašem případě pomoci (jen si nepřevádějte na utf8 ale cp1250). Výpadky serveru jsou způsobené nekvalitním hostingem. Funkce autoUTF bude fungovaj jen s daty se správnou diakritikou, ne s takto rozbitými daty. |
||
Priapos Profil |
#11 · Zasláno: 29. 10. 2012, 13:33:21
Ještě drobnost k odkázanému scriptu.
Na konec vlákna tam máte připomínku k nastavení typů konverzí: $target_collation[1] = "latin1_swedish_ci"; $target_collation[2] = "utf8_czech_ci"; $target_collation[3] = "utf8_czech_ci"; $target_character_set[0] = "latin1"; $target_character_set[1] = "binary"; $target_character_set[2] = "utf8"; $phase = 1; // zadej číslo kroku $target_collation[1] = "latin1_swedish_ci"; $target_collation[2] = "utf8_czech_ci"; $target_collation[3] = "utf8_czech_ci"; $target_character_set[1] = "latin1"; $target_character_set[2] = "binary"; $target_character_set[3] = "utf8"; Co jsem ze scriptu pochopil tak jde o tři fáze za sebou, pokaždé zvolené změnou $phase (1 - 3). |
||
Kajman Profil |
Ty indexy asi mají být tak, jak uvádíte. Místo utf8 tam musíte dát cp1250. Klidně si v pma zkuste ručně u jednoho sloupce ony změny (->latin1 ->binary ->cp1250) jestli pomůžou. Tuto sekvenci změn vygeneruje snad i takto upravený původní skript od Jakuba Vrány.
<?php header('Content-type: text/plain'); $collation = 'cp1250_czech_cs';//nastavte si dle potreby - vetsinou na kodovani stranek, ze ktere se tam dostala spatne diakritika $jmenodb='jmenoDatabaze'; //pripojeni $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) { die('Not connected : ' . mysql_error()); } // vyber databaze $db_selected = mysql_select_db($jmenodb, $link); if (!$db_selected) { die ('Can\'t use '.$jmenodb.' : ' . mysql_error()); } function mysql_convert($query) { echo "$query;\n"; //$return = mysql_query($query); //echo mysql_error(); //return $return; } mysql_convert("ALTER DATABASE $jmenodb COLLATE $collation"); $result = mysql_query("SHOW TABLES"); while ($row = mysql_fetch_row($result)) { mysql_convert("ALTER TABLE $row[0] COLLATE $collation"); $result1 = mysql_query("SHOW COLUMNS FROM $row[0]"); while ($row1 = mysql_fetch_assoc($result1)) { if (preg_match('~char|text|enum|set~', $row1["Type"])) { mysql_convert("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] CHARACTER SET latin1"); mysql_convert("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] CHARACTER SET binary"); mysql_convert("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] COLLATE $collation" . ($row1["Null"] ? "" : " NOT NULL") . ($row1["Default"] && $row1["Default"] != "NULL" ? " DEFAULT '$row1[Default]'" : "")); } } } mysql_free_result($result); ?> Když už budete mít diakritiku v pma v pořádku a budete chtít ještě převod do utf8, vyhoďte řádky 31 a 32 a upravte si chtěné porovnání na začátku. |
||
Časová prodleva: 3 dny
|
|||
Priapos Profil |
#13 · Zasláno: 1. 11. 2012, 14:56:05
Kajman:
Na tuto změnu jsem si sám netroufl, protože kdyby se nepovedla tak by byly data asi v prčicích. Na podpoře wz.cz mi potvrdili že v tabulkách s porovnáním latin2 jsou texty v Windows-1250. Změnil jsem tedy porovnávání databáze, tabulek a jednotlivých slupců manuálně příkaz po příkazu (uff - děs) na cp1250 takto (příklad): alter table phpbb_posts_text modify post_subject binary(60); alter table phpbb_posts_text modify post_subject char(60) character set cp1250; Nejde mi to do hlavy, protože je všechno nastaveno správně, web je na W1250 tak proč to zase zlobí. Někde dochází ke konverzi a nevím kde to může být. Předpokládám, že dobře nastavený pma má jedno kódování všude (a nejlépe to správné). Já to mám: web - Windows-1250 porovnávání db - cp1250_general_ci porovnávání tabulek - cp1250_general_ci porovnávání sloupců - cp1250_general_ci Kde se tam tedy bere kódování iso-8859-2 i u příspěvku, který zkusmo vložím teď. Nejde někde v pma nastavit default kódování s dědičností na nížší prvky? |
||
Kajman Profil |
#14 · Zasláno: 1. 11. 2012, 16:16:30
Tipuji, že problém je v tom, že to fórum nenastavuje správné kódování použité pro spojení s databází (viz. faq). Použije te tedy nastavení serveru (výchozí latin1) čímž dojde k nekorekntímu převodu.
Proto jsem doporučoval převést sloupeček do latin1, pak teprve do binary a cp1250. Pokud už pak v admineru nebo v pma uvidíte diakritiku v pořádku, tak je potřeba nastavit ve fóru kódování spojení na cp1250 viz. odkazované faq. Default kódování můžete nastavit i databázi, ale použije se jen při vytváření nových tabulek. Stejně tak kódování u tabulek má význam jen při vytváření nových sloupců. Viz. odkaz v [#4] |
||
Priapos Profil |
#15 · Zasláno: 1. 11. 2012, 17:40:07
Díky.
Mě tvrdili na podpoře wz.cz že jsou data ve win1250 a poslali mi návod jak to udělat. Příště se na ně vy... Sloupce v db mám již v cp1250_general_ci, takže bych to měl udělat asi tahle (?): alter table phpbb_posts_text modify post_subject char(60) character set latin1; alter table phpbb_posts_text modify post_subject binary(60); alter table phpbb_posts_text modify post_subject char(60) character set cp1250; S volání db přes SET NAMES - nebude to mít vliv pouze na nové příspěvky? Já chci jenom opravit db, správně vyexportovat a pak to staré fórum na wz zlikvidovat. |
||
Kajman Profil |
#16 · Zasláno: 1. 11. 2012, 20:12:58
Tyhle ty tři převody by mohly fungovat před tím převodem v [#13] v případě, že se používalo latin1 pro spojení. Každopádně je lepší si je odzkoušet na testovacích datech, jak bylo již psáno.
Pokud už jsou data poškozena další konverzí v [#13], můžete zkusit postupně těchto pět převodů - binary, latin2, latin1, binary, cp1250. Jinak někdo to občas opraví tak, že si udělá export a chybné znaky si v tom souboru hromadně nahradí. „nebude to mít vliv pouze na nové příspěvky?“ I na výpis starých. Ale když jde jen o export, tak to řešit nemusíte. |
||
Priapos Profil |
#17 · Zasláno: 1. 11. 2012, 22:09:19
Kajman:
„Jinak někdo to občas opraví tak, že si udělá export a chybné znaky si v tom souboru hromadně nahradí.“ Tím máte na mysli dump a převod např. v PsPadu? |
||
Priapos Profil |
#18 · Zasláno: 2. 11. 2012, 15:16:18
Kajman:
Nemám bohužel dost času a ani znalostí abych se o to pokoušel sám. Zeptám se na rovinu, udělal byste mi ten převod? Samozřejmě za úhradu. |
||
Časová prodleva: 11 let
|
0