Portál AbcLinuxu, 10. května 2025 13:55

Dotaz: Zaloha SQL tabulky - kodovani

23.4.2010 17:53 Matej Liska
Zaloha SQL tabulky - kodovani
Přečteno: 726×
Odpovědět | Admin
Dobry den, provadel jsem zalohu jedne MySQL tabulky pres aplikaci phpmyadmin (moznost EXPORT). Zde jsem zvolil export do csv (nic jineho jsem nemenil). Tabulka obsahovala texty v kodovani UTF8 a jednalo se predevsim o texty ve slovenskem jazyce. Kdyz se vsak do tohoto souboru nyni podivam napriklad pres Kate (nastaveno kodovani utf8) vidim toto:
...tak to ti moc nezávidím...tiež mi pripadá nefér, že nevieš ako vypadám...
Atd... Myslim, ze jen z tohoto je jasne, ze se neco stalo s diakritikou. Nevite prosim proc a jestli jde takova zaloha jeste nejak zachranit?

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.4.2010 18:44 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Zaloha SQL tabulky - kodovani
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejprve se podívejte, co je skutečně v tom souboru, třeb anějakým hexaeditorem. Pokud tam znaky s diakritiky jsou zapsáno jako dva znaky (tak, jak to máte uvedené ve vašem dotazu), je to vyexportované správně jako UTF-8, a je potřeba při prohlížení zvolit formát UTF-8. Pokud to v souboru na disku jsou 4 bajty, chápaly se znaky v UTF-8 jako znaky v nějakém osmibitovém kódování a znovu se zkonvertovaly do UTF-8. Pak je ale nejspíš problém v datech v databázi. U vyexportovaného souboru to opravíte tak, že jej (třeba pomocí iconv) převedete zpět na „původní“ kódování (nejspíš Latin1 nebo Latin2), a dostanete výsledek v UTF-8.
24.4.2010 11:25 Matej Liska
Rozbalit Rozbalit vše Re: Zaloha SQL tabulky - kodovani
Ano, tak mate pravdu, opravdu je to kodovani UTF na druhou:) Akcentovane znaky zabiraji ctyri bajty. Mel bych k tomu dva dotazy:

1) Samotna data v db jsou v pohode, jelikoz kdyz je pomoci sql dotazu vytahnu do me webove aplikace, zobrazeni se v pohode pri kodovani stranky utf8. Myslite ze to bude chyba v phpmyadmin? Ten nastroj pro tento ucel pouzivam uz leta, ale jeste se mi nic podobneho nestalo.

2) Chapu, ze tedy ten exportovaci algoritmus si myslel, ze kazdy z dvojice UTF8 akcentovaneho znaku je samostatny znak a proto ho jeste rozdvojil do vyslednych 4 bajtu na jeden znak s diakritikou. Co vsak nechapu je, jaktoze jde tento proces vratit prevodem na latin1? Zkousel jsem to a fakt to funguje, jen mi nejak nejde do hlavy kde se tam najednou vzalo kodovani latin1.
24.4.2010 11:58 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Zaloha SQL tabulky - kodovani
Převodem na Latin1 se vezmou vždy dva znaky z UTF-8 a převedou se na 1 znak z Latin1, to samé se udělá pro další dva znaky a tím vzniknou dva znaky v Latin1, které ve skutečnosti tvoří jeden znak v UTF-8. Je to možné díky tomu, že každý bajt ze souboru v UTF-8 je možné chápat jako znak v Latin1, takže soubor v UTF-8 je zároveň platným souborem v Latin1. Převodem na UTF-8 se žádná informace neztratí (každému znaku z Latin1 odpovídá právě jeden jednoznačný znak v UTF-8), takže můžete převod provést obráceně.

Podle mne to ale znamená, že je něco špatně v té databázi. Vaše aplikace vezme data v UTF-8, ale do databáze je uloží po bajtech jako jednotlivé znaky Latin1. Když pak data zase načítáte zpátky, načtou se jako Latin1, vaše aplikace to ale „pochopí“ jako bajty UTF-8 a tudíž je vypíše zase správně. Problém pak je, když se k datům dostane jiná aplikace, která tohle chybné překódování nedělá – jako třeba phpMyAdmin.
24.4.2010 12:11 chrono
Rozbalit Rozbalit vše Re: Zaloha SQL tabulky - kodovani
Problém nastal už pri vkladaní tých dát do DB (práve vtedy sa utf-8 ešte raz skonvertovalo do utf-8). Tie údaje "správne" načíta len aplikácia, ktorá nastaví nesprávne kódovanie pre tie prenášané údaje (phpmyadmin to nastavuje správne, preto tie údaje zobrazuje zle).

PS: Aby to fungovalo správne treba (ale až po opravení tej DB) použiť pri pripájaní k DB niečo ako SET NAMES 'utf8';
24.4.2010 02:40 d.c. | skóre: 30
Rozbalit Rozbalit vše Re: Zaloha SQL tabulky - kodovani
Odpovědět | | Sbalit | Link | Blokovat | Admin
To, co vidim o kousek vyse, mi prijde jako velice nadejne. To je proste UTF-8. Zkuste se na to podivat treba v terminalu podporujicim UTF-8 (vcetne fontu) pres less a dost mozna zjistite, ze nemate problem se zalohou, ale s Kate... :)
24.4.2010 10:33 chrono
Rozbalit Rozbalit vše Re: Zaloha SQL tabulky - kodovani
Alebo, ako už napísal Filip Jirsák, je to text zakódovaný do UTF-8 dva krát. :)
24.4.2010 13:17 d.c. | skóre: 30
Rozbalit Rozbalit vše Re: Zaloha SQL tabulky - kodovani
To, co uvedl v radku nahore, je kodovane jednou a to spravne. Samozrejme je otazkou, co ma skutecne v tom souboru.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.