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:
Sajnos, ha a tábla latin1 kódolású, s mi utf8 tartalmat mentünk bele, akkor az így fog kinézni:
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”
Í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.
ó, ha ezt két hete írtad volna le 🙂
gyűlölöm a karakterkódolásokat, azóta is verejtékben ébredek néha éjszaka 🙂
@mysql_query(”SET NAMES ‘UTF8′;”);
@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.