Problém se znakovou sadou v MySQL vs. PHP rubrika: Programování: PHP

Anonym
položil/-a 13.11.2014

Snažím se o migraci databáze, což většinou nebývá problém. ALE:

  1. databáze má kódování utf8_czech_ci
  2. tabulky mají kódování nastavené utf8_czech_ci + některé utf8_general_ci
  3. spojení PHP s databází používá kódování LATIN1
  4. soubory scriptů jsou v kódování UTF8
  5. Content-Type výstupu je UTF8
  6. PHP scripty používají interní kódování ISO-8859-1
    (ano, byl to nějaké expert, který asi moc neuměl sjednotit kódování.. ale já to potřebuji vyřešit :-)

data ve výsledném HTML souboru se zobrazují správně. Avšak v databázi vypadají znaky takto:
"Nahlaste nám kde, vložte odkaz nebo popište problém. Pokusíme se chybu co nejdříve opravit."

zkoušel jsem mnoho možností.. co mě z hlavy napadá:

  1. mb_detect_encoding = vždy vrací hodnotu UTF8
  2. mb_check_encoding
  3. mysqli_set_charset na utf8 + ALTER TABLE .. CONVERT utf8
  4. přes select: SELECT CONVERT(CAST(CONVERT(text USING LATIN1) AS BINARY) USING UTF8) AS text FROM clanky; -> i v opačném pořadí ..
  5. alter database a alter table na asi 50 různých kombinací kódování..
  6. select s různými typy 'set names' a funkci
    function str2utf ($string) {
    $encode = mb_detect_encoding($string);
    return mb_convert_encoding($string, 'UTF-8', $encode);
    }

    ..asi toho bylo více, ale nepadají mě zrovna teď

Avšak stále se mi nedaří převést text do správné podoby.... Bohužel není možné přepsat data ručně (databáze má cca 200MB)...

Máte někdo nápad, který jsem nevyzkoušel a mohl by fungovat? :-) Byl bych nesmírně zavázán, díky

Komentáře

  • Anonym : zkoušel jsem i třídu, která by měla umět převést text do utf8, ale také selhala ... https://github.com/neitanod/forceutf8 13.11.2014
  • coolmip : mb_detect_encoding ma obcas problem s detekciou kodovania (php 5.5 napriklad). Podla vzorky textu to vyzera na utf8. Naozaj mate spravne pripojenie na DB vo vasom klientovi? Ak ten text vypisujete v PHP ktore ma spojenie s DB v LATIN1 preco ho nezmenit na UTF8 a skusit to tak? 13.11.2014
odkaz Vyřešeno
Anonym
odpověděl/-a 14.11.2014

Tak nakonec jsem to vyřešil pracným, ale funkční řešením. Problém byl s PHPMyAdminem, který byl starý a neuměl správně exportovat celou databázi. Takže jsem musel každé tabulce vytvořit klon a nakopírovat do ní data s konverzí LATIN1 => UTF8 takto:

CREATE TABLE nova_tabulka LIKE stara_tabulka;
INSERT INTO nova_tabulka
SELECT
    ..všechny sloupce manuálně vypsat:
    CONVERT(CAST(CONVERT(nadpis USING LATIN1) AS binary) USING UTF8) AS nadpis,
    CONVERT(CAST(CONVERT(anotace USING LATIN1) AS binary) USING UTF8) AS anotace,
    CONVERT(CAST(CONVERT(obsah USING LATIN1) AS binary) USING UTF8) AS obsah,
FROM stara_tabulka;

je šílené to aplikovat na takové množství tabulek, ale lepší než nic :-) i tak děkuji za nápady a reakce!

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.