Az ördög nem alszik, Isten nem bottal ver és hasonló klisék igazságtartalmáról fogok itten nyilatkozni.
Kezdjük a konklúzióval. Rövid válasz: igaz. A bejegyzés többi része a hosszú válasz, ami már már epikus, de legalábbis eposzi tulajdonságokkal rendelkező.
Szóljon hát, végtelen w00t és n00bság mezein edzett fületekbe, eme rege, lol.
Vegyünk tetszőleges mySQL adatbázisszervert és egy UTF-8 karakterláncot. Próbáljuk meg PHP segítségével a karakterláncot bármilyen táblában
visszanyerhető formában tárolni. Ó! Bazdmeg. Itt jön a
deus ex machina, az apokalipszis lovasainak enumerációja meg is történt (lásd fentebb, rögvest az in medias res után, az invokáció előtt). Tehát a beígért cselekménymozzanat, amikor is tetszőleges felsőbb (alsóbb) hatalom úgy döntött, hogy ezt a feladatot közel lehetetlenné teszi, ezzel büntetve az egyszerű, ám de web-babér aspiráns bölcsész-informatikus krosszóver fattyakat, akik szövegelni is akarnak, meg mégse.
Ha hatalmunk omnipotens, már-már rootszerű, akkor ugye kényünkre kedvünkre konfigurálhatjuk a dolgokat, ami jó, de még mindig csak oly' értékes, mint Dávid öccsének a törött játékparittyája Góliát félisten nagybátyával szemben.
Szóval messze zengő hangunkon begépeljük, hogy a mySQL szerver alapból
utf8 kódkészletet használjon mindenhol. Ezt az installálásnál megkérdezi. Ugyan már megmutatkozik a foga fehérje, hisz' defaultnak a latin2 van berakva, és kriptikus előreutalások formájában ad csak hírt arról, hogy mennyire nem jó az nekünk jelen esetben.
Feltelepült, megáldatott, megkereszteltetett, körülmetéltetett, felkenetett, szenté avattatott, system service-szá tétetett mySQL 5.0.45-community-nt installációnk üzemképes. Root jelszó beállítva, szuper. Sikeresnek érezzük magunkat. (Nyilván csak így fog ütni a katarzis)
Alapból a legújabb PHP 5-öt van fent, meg tetszőleges Apache. Eztán a php.ini-ben a nehézsúlyú .510-es kaliberű
mysqli extension betöltve, igazi ínyenceknek való, speciálisan kifejlesztett, uránmagvas, mindent visz. Lágyszívűbbek beérhetik akár a .357-es mysql-lel is,
i nélkül.
Ha hamar végezni akarnánk a felvezetéssel, akkor feltehetnénk a bleeding-edge
phpMyAdmin 3.0.0-dev verziót, ami csak utf8-at támogat, de valószínűleg az meg túl bugos lenne, és elrontaná a mélylélektant a gecibe.
Maradjunk a megszokott latest-stable megoldásnál (legutolsó stabil,
phpmyadmin.net) feltesszük, beállítjuk (, de az egy másik mese, most kihagyjuk a pokol egyéb köreit és bugyrait, Beatricse már vár, habár nem egészen ott, ahol azt megszokhattuk, m~hahaha).
Létrehozunk egy adatbázist meg egy táblát és örülünk hogy tudunk bele tenni egyszerű szövegeket.
Létrehozunk egy új felhasználót, meg neki egy adatbázist, hogy had buzerálja a phpMyAdminnal, mert az úgy szokás. (Mármint nem a phpMyAdmin része a hagyomány ebben)
Oké, eddig nem is volt olyan vészes, hah. Gyorsan kattintunk is a PHPEdit ikcsyjén a gyorsíndításnál a tálcán, gyorsan megkomponálunk pár sort, majd gyorsan kipróbáljuk.
$kapcs = mysqli_connect('localhost','józsi','szeretlek_piri');
mysqli_select_db($kapcs, 'józsi');
$kv = mysqli_query($kapcs, 'INSERT INTO teszt SET adat="útéefnyóc sztring sok ő-vel.. jól!"');
Elmentjük, UTF-8 kódolással, mondjuk teszt.php néven bele a webszerverünk által kiszolgált könyvtárak valamelyikébe.
Igen, most jön az, hogy vagy hibaüzenetet kapunk, vagy egyszerűen kérőjelek, krix-kraxok, téglalapok, egyéb szimbólumok foglalják el a szép ékezetes betűink helyét, ha megnézzük phpMyAdminnal a tábla tartalmát.
Na jó, akkor jöhet a lényegi momentum, amikor is a krosszóveres hősünk megkapja a jóslatot, hogy létezik a fehér elefánt, tehát meg lehet csinálni jól is ezt.
mysqli_query($kapcs, 'SET NAMES utf8');
Mert az jó, ha a biztonság kedvéért, mindenféle változót, ami a kapcsolatra vonatkozik beállítunk ilyenre.
Persze, még nem vagyunk sehol, legalábbis Zrinyi ekkor még élt (jah, meg a szelíd vadmalac is), Odüsszeusz a nimfá(ka)t kefélte, akár csak Gilgames, aki meg a haverjával, Enkiduval szaunázott, úgy finn módra, szorosan.
Tehát mit is kéne tennünk, hogy működjön a dolog? :|
Segít a kellékes. Én
ehhez hasonló buggal találkoztam. Szinte Dunát lehetne rekeszteni az utf8-cal, annyiszor szerepel ebben a bug reportban, de kiderül, hogy mégis csak latin1 kódolás keveredik a Hétszünyű Koponyáni monyó levesébe. (Egyesek szerint pl. Firefox helyesírási szótár: Kaponyányi ill. Google keresés eredményeképp: Kapanyányi monyók, de omfg, majd otthon megkeresem az általános iskolás könyvemben, de mivel ez egy népmese nincs kanonizálva, lehetne akár Hipergenyó Terrortörpe is :P)
Szerencsére nagyon jól szórakozom, miközben ezeket a sületlenségeket örökítem meg, de valahogy úgy sejtem, kezdek magányosodni :D
Hol is tartottam? Jah igen. Van egy olyan, hogy collation. Elvileg arra való, hogy ha azt mondom, hogy
SELECT a,b FROM t WHERE a > b; ahol
a és
b is string (varchar, text), akkor a collation fájl alapján végzi az összehasonlítást/kiértékelést.
Tehát ha belegondolunk, ennek semmi köze nincs a tényleges tároláshoz. Hát .. tévedünk. Ennek örömére itt egy kis
motiváció. :]
Szóval a fabula végkifejlete, hogy jól meg kell erőszakolni a hollót, akkor elejti a saj-- .. és akkor .. öö .. mindenhol ahol csak lehet UTF-8-at kell beállítani. Még ott is, ahol semmi értelme.
Várból kirohanás, buzi kérők lemészárlása, tetszőleges beugratós kerekes-üreges állatok segítségével bármely Trója típusú vár bevétele, stb..
Én meg alszok, de minek, úgy tűnik túl pihentem magam így is :)
Az egész különben azért volt, mert a 291-es posztban a µ (mű) átváltozott µ -re aztán visszaírtam, de kérőjel lett belőle. Pfff.