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ó. 🙂

Comments

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.