MySQL PHP5 äöåÄÖÅ+vastaavat!
Tässä ei tällä kertaa varsinaista kysymystä, mutta hieman ihmettelyjä, tuli taas hakattua nenää työpöytään puoli tuntinen, kun skandinaaviset aakkoset tulostuivat mysql databaseen ? kysymysmerkkeinä, minulla ongelma ratkesi kun tallensin PHP tiedoston uudestaan, PHP tiedostoni index.php oli alkuun tallennettu ISO formaattiin, ja vaihdoin formaatin sitten UTF8 muotoon, niin, onko se sitten niin että PHP fileen tallenne formaatti päättää myös mitä muotoa MySQL databaseen tallentaa, yritin myös ISO fileessä kirjoittaa MySQL komennon "mysql_set_charset('utf8');" mutta kaikki skandit yhä tallentuivat ? kysymysmerkkeinä, eli, siis index.php tiedoston tallennus muoto ratkaisee mitä formaattia MySQL tietokanta sisältää ?
Aika ihmettelyjä taas !
------
MySQL-tietokannassa on oma merkistönsä, ja editorillasi voit valita tiedostosi merkistön. Tiedostopääte ei ratkaise, mutta yleensä nettisivuilla käytetään PHP:tä kun halutaan päästä käsiksi MySQL:ään. Käyhän siihen jotkin muutkin, kuten Java ja Python.
PHP-tiedoston merkistö ei vaikuta kuin niihin merkkeihin, jotka olet kirjoittanut suoraan PHP-tiedostoon. MySQL-yhteyden merkistö asetetaan mainitsemallasi funktiolla (paitsi jos käytät PDO:ta). Selaimelle pitää ilmoittaa merkistö HTTP-otsikkotiedoilla.
<?php // Tarkistus PHP-tiedoston merkistöstä: if ("ä" != "\xC3\xA4") die("PHP-tiedosto on tallennettu väärin!"); // Ilmoitus MySQL:lle (vasta yhdistämisen jälkeen!): mysql_set_charset("utf8"); // Ilmoitus selaimelle: header("Content-Type: text/html; charset=UTF-8");
Jos olet jo ehtinyt tallentaa tietokantaan dataa väärin, se ei korjaudu näillä muutoksilla, joten kannattaa tyhjentää koko tietokanta ja yrittää uudestaan.
Yksinkertaistaen asian: kaikkialle pitää laittaa käyttöön UTF-8, jotta saat UTF-8:aa. Jos saat virheellisiä ääkkösiä, niin jossakin on jossain vaiheessa jokin ollut väärin, tai on yhä edelleen.
1) MySQL-yhteyden täytyy olla UTF-8.
2) Sivulla olevan tekstin täytyy olla UTF-8 -muodossa.
3) Sivun alussa ei saa olla ns. Byte-order markia! UTF-8:n tapauksessa kolme tavua.
4) Selaimen täytyy tietää, että sivu on UTF-8. Tähän käy Metabolixin näyttämä vaihtoehto kuin myös head-tagin alussa <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
MySQL itseasiassa tallentaa aina tekstin itseensä UTF-8:na. Jos yhteys on UTF-8, niin sitten tallentuvalle tiedolle ei tehdä oikeastaan mitään. Ainut rajoitus on 0x10000 ja sitä suuremmat merkit, joita MySQL ei (kai vieläkään) tue, ne vain pudotetaan pois.
Jos yhteys on taas jotain muuta kuin UTF-8, niin sitten sitten sisääntulevaa ja ulosmenevää tekstiä muunnetaan muodosta toiseen. Tässä on sellainen juju, että sisääntuleva teksti voi olla UTF-8:aa, mutta jos yhteys ei ole UTF-8, niin teksti muunnetaan siitä huolimatta UTF-8:ksi... jolloin saat kaksoiskoodattua UTF-8:aa MySQL-tietokantaan. Tämän seurauksena esimerkiksi aakkoksellinen järjestäminen ei toimi oikein. Eli kannattaa pitää se yhteys UTF-8:na!
Sinulla ongelma on kuitenkin toisin päin, eli HTML-sivu on jotain muuta kuin UTF-8 – jos ei muuten, niin selaimen mielestä. Vaikka MySQL:n yhteys on UTF-8 -moodissa, niin jos syötät sinne iso-8859-1 niin sitten se menee myös kantaan sellaisenaan, tosin esimerkiksi ääkköset lasketaan vialliseksi UTF8-koodaukseksi, jolloin saat kymysysmerkkejä kun haet kannasta dataa.
Ja kuten Metabolix totesi, jos mikä tahansa kohta on ollut pielessä jossain vaiheessa, niin vanha data on väärässä muodossa. Joko viat pitää korjata käsipelillä esim. phpMyAdminilla tai sitten kanta tyhjäksi ja homma alusta. Jos tietokanta on iso, niin sen muuntaminen oikeaan muotoon on hyvin vaikeaa (nimim. olen tehnyt tämän muutaman kerran, pari ekaa kertaa "vähän feilasi").
Tässä englanniksi hyvää infoa UTF-8:sta
Tosin voi olla osin vanhentunutta, koska sivun sisältö on jo seitsemän vuotta vanhan tiedon pohjalta. Kannattaa lukea PHP:n Unicode-tuesta.
Merri kirjoitti:
MySQL itseasiassa tallentaa aina tekstin itseensä UTF-8:na.
Mitä varten sitten tauluilla ja sarakkeilla on omat merkistömääreensä (oletuksena vieläpä usein latin1), ja millä mekanismilla nämä estävät vääränlaisen datan tallentamisen, jos kerran mitään muunnosta ei tehdä? Epäilen siis, että yksinkertaistuksesi ei nyt pidä paikkaansa.
Pikatarkistuksella tuossa kohtaa olinkin vain ymmärtänyt väärin yhden toisen artikkelin. MySQL tallentaa määritellyllä merkistöllä ja sen sääntöjen mukaan. Ja tämän varmistin kurkkaamalla MYD-tiedoston sisältöä, joka ei ollut UTF-8 -muodossa.
Muoks!
Tarkennuksena vielä tuosta väärin ymmärtämisestä, kyseessä oli metadata, jonka MySQL aina tallentaa UTF-8:na.
Merri kirjoitti:
Ainut rajoitus on 0x10000 ja sitä suuremmat merkit, joita MySQL ei (kai vieläkään) tue, ne vain pudotetaan pois.
Tämä ongelma on korjattu MySQL:n versiossa 5.5.x
Sama ikuinen ongelma minullakin.
Luon koodia johon kitjoitan esim Pääsivu.
Tämä näkyy minulla oikein, mutta muilla näkyy ääkköset kummina merkkeinä.
Kokeilen laittaa seuraavan pätkän.
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
Kas kummaa, tällä saan itsellenikin näkymään kummat merkit.
Edelliselle:
Tiedätkö missä formaatissa talletat tiedoston? Tämä tallennusformaatti pitää valita editorissa.
En, mistä tämän saa tarkistettu PsPad - editorista?
Jos kerrot selaimelle metatageilla että nyt tuleva sivu on koodattu utf8-formaatissa, niin tottakai sinun täytyy pitää huolta että se sivu on todellakin tässä formaatissa eikä missään satunnaisessa formaatissa.
Otat yksinkertaisesti valikosta format ja sieltä utf8 ja lopuksi save.
Onko sinulla PsPad, ei ihan nuin tapahdu siinä.
Mutta näytti olevan käytössä formaatti ANSI
En ole käyttänyt tuota editoria, mutta uskaltaisin silti väittää että homma menee niinkuin kerroin.
EDIT: LAitoin sitten googleen tuon ja antoi tälläisen sivun
http://gogogadgetscott.info/pspad/menuformat.htm
Joo, löysin jo aikaisemmin mistä muutetaan, mutta ihan niin ei mennyt kun aluksi meinasit.
PS. Kiitoksia kaikille! On mukava oppia aina jotain uutta :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.