Problém se znakovou sadou v MySQL vs. PHP rubrika: Programování: PHP
Snažím se o migraci databáze, což většinou nebývá problém. ALE:
- databáze má kódování utf8_czech_ci
- tabulky mají kódování nastavené utf8_czech_ci + některé utf8_general_ci
- spojení PHP s databází používá kódování LATIN1
- soubory scriptů jsou v kódování UTF8
- Content-Type výstupu je UTF8
- 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á:
- mb_detect_encoding = vždy vrací hodnotu UTF8
- mb_check_encoding
- mysqli_set_charset na utf8 + ALTER TABLE .. CONVERT utf8
- 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í ..
- alter database a alter table na asi 50 různých kombinací kódování..
- 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
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:
Nebo se přihlaste jménem a heslem:
Komentáře