latin1 táblában tárolt utf8 tartalom

Aki nem most hozat létre adatbázisát, hanem még MySQL4, esetleg 3-mas időkben, az könnyen szembe találhatja magát a címbeli problémával:

latin1 táblák

Sajnos, ha a tábla latin1 kódolású, s mi utf8 tartalmat mentünk bele, akkor az így fog kinézni:

latin1 utf8

Ez nehezen olvasható, s gondolom senki se szeretné látogatóit kitenni egy ehhez hasonló kódolású oldal olvasásának. Feladat egyszerű, ki kell nyerni a tartalmat utf8 kódolásban, majd a tábla kódolását latin1-ről utf8-ra kell változtatni, s visszatölteni bele a tartalmat.

Hogyan?

A legtisztább a helyzet, ha van parancssoros hozzáférésünk, ekkor kiadjuk a
mysqldump -u NÉV -p --database `ADATBÁZISUNK_NEVE` --default-character-set=latin1 > ADATBAZISUNK_NEVE.sql

Így egy utf8 kódolású fájlt kapunk, amit ezután vissza kell már csak tölteni a MySQL adatbázisba. Ahol esetleg latin1 szerepel benne, azt cseréljük le utf8-ra:

sed 's/latin1/utf8/' db.sql > db_franko.sql

Ha pedig abszolut biztosra akarunk menni a kódolással, akkor még ezt a parancsot is kiadhatjuk (nem feltétlen szükséges):

iconv -f utf-8 -t utf-8 db_franko.sql -c -o db_uber_franko.sql

Ezután vissza a levesbe:

mysql -u NÉV -p < db_uber_franko.sql

Ha nincs a szerverhez parancssori hozzáférésünk, akkor phpmyadmin segítségével mentsük el az adatbázist/táblát, majd szintén phpmyadmin segítségével localhoston (xampp, lampp, mamp, stb.) importáljuk be utf8 (!!!) kódolással a dumpot. Ezután localban már mehet a fenti parancssori bűvészmutatvány, s az eredmény pedig mehet fel a tárhelyünkre.

A megoldás ennyire egyszerű, de ha erre nem jön rá az ember, nem talál valami jó forrást a neten a több ezer találat között, akkor úgy jár, mint mi anno lipileevel, hogy a nem túl szép kódolású szöveget karakterenként próbáltuk átkódolni sikertelenül. A titok pedig ennyi. Hihetetlen.

Először Derek Sivers ultrakacifántos írása volt a mankó, de valamelyik sokadik lépés után feladtam. A fenti módszer egyszerűbb volt. Az ötlet egyébként innen származik. Izgalmas volt még Rob Marscher php-s megoldása, amivel még próbálkoztam, de valamiért nem jártam sikerrel.

A google kb 9000 találatot jelenít meg a végül sikeres utf8 stored in latin1 table keresőkifejezésre. Azt hiszem ezekszerint nem egyedi probléma, de könnyen orvosolható. 🙂

Iratkozz fel, hogy elsőnek értesülj új bejegyzésekről:

5 responses to “latin1 táblában tárolt utf8 tartalom”

  1. Bártházi András Avatar

    Írtam én erről egy kicsit régebben:
    http://weblabor.hu/cikkek/mysql50karakterkodolasok

    Esetleg megoldás lehet még a helyben konvertálás is: adott egy TEXT oszlop latin1 kódolással, utf8 tartalommal. Átalakítod BLOB-bá, átállítod a latin1-et utf8-ra, majd visszaalakítod TEXT-té. A BLOB ugye bináris tartalom, így nem karakterkódolás váltáskor nem nyúl hozzá a MySQL, és nem módosítja a tartalmat.

  2. dani Avatar

    ó, ha ezt két hete írtad volna le 🙂

  3. lipilee Avatar

    gyűlölöm a karakterkódolásokat, azóta is verejtékben ébredek néha éjszaka 🙂

  4. eMeM Avatar

    @mysql_query(”SET NAMES ‘UTF8′;”);

  5. kobak Avatar

    @ba78 köszönöm a linket, hasznos írás.
    @dani én is ha hamarabb találom meg, pár régebbi kaland és próbálkozás sikeresebb lett volna. 🙂
    @lipilee Te szegény! 🙂
    @eMeM kifejtenéd? Illetve azt hiszem tudom mire gondolsz, de nem vagyok 100%-osan biztos.

To respond on your own website, enter the URL of your response which should contain a link to this post’s permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post’s URL again. (Find out more about Webmentions.)