Autor Zpráva
4ever
Profil
Jak převést data z latin1 do utf8? Je na takový převod v mysql nějaká funkce? Jedná se o všechny sloupce všech tabulek.
Kajman_
Profil *
http://php.vrana.cz/prevod-kodovani-mysql.php

S tím, že když máte data v pořádku, tak nemusíte převádět charset u sloupců na binary.
4ever
Profil
Zkusil jsem ten script od p. Vrány s tím, že jsem tam dosadil následující:

1. $source_collation = "latin1_swedish_ci";
2. $source_collation = "utf8_czech_ci";
1. $target_character_set = "binary";
2. $target_character_set = "utf8";

Ten první (1.) převod se myslím povedl, všechny sloupce skončili v binary.
Ten druhý (2.) převod se nepovedl, zůstává to v binárním kodování.

Nevím jestli s tám scriptem správně zacházím. Ten návod mi nepřijde moc jasný, hlavně ten převod na cílové kódování a collation.
Kajman_
Profil *
4ever:
Nějak tomu jeho scriptu nerozumím. A to je problém, protože nemohu spustit něco, co nevím co to vlastně udělá a jak se to má nakonfigurovat (nejsou tam vysvětleny argumenty k tomu scriptu od p. Vrány).

Jsou vysvětleny v tom skriptu (Usage: php $argv[0] db collation). Je připraven na spouštění z příkazového řádku. Můžete si ho upravit a parametry předat jinak. Ale pokud už charset u sloupců máte nastaven na utf8, tak bez dalších úprav není pro Vás vhodný.

1. Nejsou

2. Ne. V tohle případě (kdy máte nejspíše utf8 data převedená prodle pravidel latin1->utf8), by asi šlo
převést sloupce na latin1 (provede se konverze jakoby z utf8 do latin1),
pak na binnary (to už je ve skriptu, neprovede se automatická koverze)
pak na utf8 (to už je ve skriptu, neprovede se automatická koverze)

3. Další variantou je export dat do latin1, úprava výsledku a import zpět. Viz. např.
http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=113638#7

Všechno si dělejte na testovacích datech, než najdete pravý způsob.

Až budete mít v např. v admineru diakritiku správně, nezapomeňte si v aplikaci nastavit připojení viz. faq. Ignorováním tohoto nastavení jste se totiž dostal to této situace.
4ever
Profil
Kajman:
Až budete mít v např. v admineru diakritiku správně, nezapomeňte si v aplikaci nastavit připojení viz. faq. Ignorováním tohoto nastavení jste se totiž dostal to této situace.

S tím bych si dovolil nesouhlasit. Do té situace jsem se dostal z úplně jiného důvodu, ale na to jak nastavit charset a collation tabulky a sloupců a k čemu to je jsem přišel až později.

Ještě pozn. k přechozímu. Collation. Ale jaké? Zdroj nebo cíl?
4ever
Profil
Kajman:
2. Ne. V tohle případě (kdy máte nejspíše utf8 data převedená prodle pravidel latin1->utf8), by asi šlo
převést sloupce na latin1 (provede se konverze jakoby z utf8 do latin1),
pak na binnary (to už je ve skriptu, neprovede se automatická koverze)
pak na utf8 (to už je ve skriptu, neprovede se automatická koverze)

Tak možná to už chápu, ale co collation? Mám v druhém kroku převést/dosadit na utf8_czech_ci?

Tady to je můj současný script který jsem napsal/přepsal po p. Vránovi a věřím, že je to takto přehlednější:

mysql_select_db("pokus");
mysql_error();

function mysql_convert($query) {
    echo "$query;\n<br>";
    $return = mysql_query($query);
    echo mysql_error()."<br>";
    return $return;
}

$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

mysql_convert("ALTER DATABASE pokus COLLATE $target_collation[$phase]");

$result = mysql_query("SHOW TABLES");
while ($row = mysql_fetch_row($result)) {

  if ( $phase == 1 ) mysql_convert("ALTER TABLE $row[0] CONVERT TO CHARACTER SET $target_character_set[$phase] COLLATE $target_collation[$phase]");

  if ( $phase > 1 ):
    mysql_convert("ALTER TABLE $row[0] COLLATE $target_collation[$phase]");
    $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 $target_character_set[$phase]");
            mysql_convert("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] COLLATE $target_collation[$phase]" . ($row1["Null"] ? "" : " NOT NULL") . ($row1["Default"] && $row1["Default"] != "NULL" ? " DEFAULT '$row1[Default]'" : ""));
            "";
        endif;
    endwhile;
  endif;
}
mysql_free_result($result);


Jednoduše script se spustí třikrát, pokaždé se musí nastavit číslo fáze. S tím, že ten první převod tabulek provádím pomocí CONVERT TO.
Kajman_
Profil *
Uvědomte si, že podle collation se při úpravě sloupce určí i charset, takže uděláte

převod na latin1 (provede se konverze znaků)
převod na latin1
převod na binary (neprovede se konverze znaků)
převod na utf8 (neprovede se konverze znaků)
převod na utf8
převod na utf8
4ever
Profil
Ještě jsem u toho scriptu opravil indexy. A teď jsem docela překvapen, protože to funguje už v druhém roku! Takže už se mi to správně zobrazuje v UTF8. Hodně užitečný script!

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0