Autor Zpráva
Priapos
Profil
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
Když se podíváte do běžící staré databáze např. adminerem, tak tam je tam diakritika v pořádku?
Priapos
Profil
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
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' 
Někde je něco blbě ale netuším kde a co.

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
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
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
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
Nic nekonvertuji, jenom se přihlásím do db


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>";
}
No a výsledek je 90% ve Windows-1250 a zbytek ISO-8859-2.
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
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
a už tam nebyla oprava. Můžete mi říci jak to má být správně? Nemá to být takto?:
$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.
Priapos
Profil
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;
což pomohlo ale z nějakého dúvodu se obsah tabulek tímto dotčených převedl do iso-8859-2, takže mám problém se zobrazováním ž apod., anebo se to převádí při dotazu.
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
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
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
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
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
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.

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: