Adatbázis, meg a karakterkódolásai

Tegnap óta szenvedek az alábbi problémával, és halvány lila gőzöm nincs, hogy mit csináljak...

A minap az egyik weboldalt átvittem egy másik hosting céghez, mivel ahol eredetileg volt, mindig csak a zűr volt... 403, 503 hiba, és hasonló nyalánkságok...

Szóval tegnap jött az e-mail, hogy a domain át van téve. Nosza...

Már jó régen kiexportáltam az sql táblákat phpmyadmin-nel, ami zökkenőmentesen le is zajlott...

Szóval tegnap este, feltöltöttem az új helyre a portált, majd beimportáltam az sql táblát... Csináltam már máskor is ilyet, igaz, "házon belül", nem volt gond... Konfig fájlok megfelelően átír, és voálá, máris teljes harci díszben pompázik a régi-új oldal.

Szóval sql tábla import, oldal megnyit, és ez fogad:

Mint látható a karakterek jól össze vannak kuszálódva.. A portál motor még E107 0.7.11, és UTF-8-as változat. A motor saját dolgai, jól jelennek meg, viszont az általam felvitt tartalmak ékezetei helyett ??, meg hasonló idétlen karakterek jelennek meg...

Amit próbáltam:
recode latin1...utf8
recode latin2...utf8

Az sql táblában is módosítottam már a DEFAULT CHARSET -et latin1, és latin2-re is, sőt utf8-ra is...

A Spiderhost, ahová most került az oldal utf8_unicode_ci -t használ, viszont, ha kiexportálom pl. az én SQL tábláimat, abban a DEFAULT CHARSET-ben latin1 szerepel...

Szóval teljes a kavar...

Várnák további ötleteket, mert ebben az oldalban majd' fél éves munkám fekszik, és semmi kedvem újrakezdeni nulláról... :(

Hozzászólások

Régi szolgáltatónál a mentés előtt konvertáltad az adatokat?
Importnál megadtad, hogy UTF8 Charset-et használsz?

Hát, ha a konvertálás szó alatt azt érted, hogy a PHPMyAdmin,
MySQL kapcsolat egyeztetés: mező alatt utf8_unicode_ci -t állítok be, akkor arra azt mondom, hogy alapból azon áll a legördülő lista. De ehhez képest akkor is latin1-ben konvertál... Most importnál belőttem a latin1-et még rondább... :(

--
Charlos

-- http://www.uvegcsont.hu -- / -- http://ganyikaroly.net --
Jól csak a szívével lát az ember. Ami igazán érdekes, az a szemnek láthatatlan. - by A Kisherceg

Lássuk csak.

1. A MySQL-nek (szinte) mindegy, hogy milyen karakterkészlettel _tárolja_ az adatokat. Akár mezőnként lehet más és más.
2. A MySQL-nek mindegy, hogy milyen karakterkészlettel _fogadja_ és _szolgáltatja_ az adatokat. De ezt meg kell mondani neki.

Ha nem határozod meg, hogy milyen karakterkészletet akarsz használni (SET NAMES parancs pl, kapcsolódás után) és egyéb módon sincs ez definiálva akkor könnyen belefuthatsz, hogy valamilyen platform defaultként értelmezi a MySQL. És itt lehet igazán elrontani a dolgokat, ha a MySQL azt hiszi, hogy az alkalmazás latin1_swedisht beszél hozzá, de valójában UTF-8-at, akkor könnyen elképzelhető hogy az adatok pl. egy utf-8 mező esetén latin1_swedish -> utf-8 konverzión fognak átesni az eleve utf-8 karaktereid. Kiolvasáskor meg utf-8 (de már eleve értelmetlen karakter) -> latin1, és máris két kérdőjelet kapsz már a resultsetben is.

Az export tartalmazni szokta a karakterkészletet is így nem itt szokott elromlani, hanem inkább ott, hogy az új platformon más a default connection encoding.

Azért azt is nézd meg, hogy a szolgáltatód nem adja -e meg a charsetet a http headerben, mert az "felülírja" a meta taget.
Egyébként az e107 valamiért kedvencem. Kb olyan, mint az UHU; ha egyszer megy, akkor olyan, mint az olajozott villám, de néha kínszenvedés megoldani a problémákat.

Nem mindíg a db-vel van a probléma...tapasztaltam.

Szerk: Megnéztem, valóban a db-vel van a probléma. Nem kevertél bele valami iso8859-2 modult, vagy fájlt?

kötöjelkötöjel
//:wladek's world

Láthatóan a magyar ékezetek helyett két kérdőjel jelenik meg. Ebből arra következtetek, hogy az adatbázisban UTF-8 kódolással szerepel a szöveg, de a megjelenítő azt éatin1 vagy latin2-ként olvassa ki. Szerintem a megjelenítő réteg karakterkódolásán állítgass valahogy...

-- MySQL dump 8.22
--
-- Host: localhost Database: pornosite
---------------------------------------------------------
-- Server version 3.23.55-log

/*!40101 SET NAMES utf8 */;

--
-- Table structure for table 'access'
--

CREATE TABLE access (
PRIMARY KEY (aid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Pl. itt egy táblám, mert mostanában nekem is volt hasonló problémám. Innen ami fontos az az elején lévő set names=utf8, és ez a sor:

ENGINE=MyISAM DEFAULT CHARSET=utf8;

Ezt minden tábla elejére be kell raknod és utána lesz jó :S
-------
-akkor tegyél fel debiant // -persze, és attól a routerem megjavulna igen // -nem, de az lenne a legkisseb problémád

Amit hatalmas kínok árán kiderítettem:

A kapott mysql dump fejléce, amit a phpmyadmin exportál, UTF-8 (MC edit alatt jól jelenik meg), viszont a mysql többi része latin2, de még ebben sem vagyok olyan biztos.

Ugyanis a DEFAULT CHARSET után latin2 áll, és az elektromos gitár helyett ezt látom: Elektromos gitĂĄrok... Szóval passz... Próbáltam már én mindent, de mindent. recode latin1...utf8 , latin2...utf8 utf8...latin2, stb...

Belenéztem már az én oldalam sql tábláiba is, és ott is kb. ugyanez a helyzet: utf8 a fejléc, viszont itt latin1 a többi tábla kar. kódolása. Eljátszottam már ugyanezt, a csutorral is, de ugyanaz... Ronda, ronda, és ronda...

De néha még rondább eredményt kapok, mint most kinéz... Valaki kérem, ha tud segítsen, mert komolyan mondom, már a sírógörcs határán vagyok (nem vicc)... Nem hiszem el, hogy egy nyamvadt költözés ennyi szenvedéssel jár.

--
Charlos

-- http://www.uvegcsont.hu -- / -- http://ganyikaroly.net --
Jól csak a szívével lát az ember. Ami igazán érdekes, az a szemnek láthatatlan. - by A Kisherceg

Nekem karakterkódolási ügyben segített a következő (ezt kellene valahogy a mysql_select_db után beszúrni):

mysql_query("SET NAMES 'utf8';");

Előtte meg az egész dumpot egységesen utf8-ra konvertálni valahogy.

Andi, really. Take it from me. If I tell you something, I'm usually right.

Szia!
Nekem egy hasonló problémám volt, a következő menetrend segített.

//régi adatbázis kiexportálása
mysqldump --user=root -p --default-character-set=cp852 -c --insert-ignore --skip-set-charset mandelbrot >mandelbrot_cp852.sql

//adatkonverzió (bár cp852 az export, de iso-8859-2-ből lett jó a konverzió!)
iconv -f iso-8859-2 -t utf8 mandelbrot_cp852.sql > mandelbrot_utf8_8859-2.sql

//default charset eltávolítása (a dumpban hiába volt megadva a --skip-set-charset kapcsoló, mégis betette
sed -i -e 's/DEFAULT CHARSET=cp852/ /' mandelbrot_utf8_8859-2.sql

//régi adatbázis eldobása, újbóli létrehozása
mysql --user=root -p --execute="DROP DATABASE mandelbrot; CREATE DATABASE mandelbrot CHARACTER SET utf8 COLLATE utf8_general_ci;"

//adatbázis importálása
mysql --user=root -p --default-character-set=utf8 mandelbrot < mandelbrot_utf8_8859-2.sql

//az adatbázis kapcsolatnál (connect) legyen beállítva:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");

"Egyre több informatikusnak van nemi élete. Hígul a szakma..."