Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL ja ääkköset?

Sivun loppuun

kpzpt [30.01.2011 11:17:20]

#

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 !

------

Macro [30.01.2011 11:24:33]

#

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.

Metabolix [30.01.2011 13:01:56]

#

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.

Merri [30.01.2011 13:55:11]

#

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.

Metabolix [30.01.2011 14:05:26]

#

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.

Merri [30.01.2011 14:17:35]

#

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.

mrl586 [03.02.2011 02:12:50]

#

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

manninen [01.03.2011 10:20:46]

#

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.

makumaku [01.03.2011 10:31:53]

#

Edelliselle:
Tiedätkö missä formaatissa talletat tiedoston? Tämä tallennusformaatti pitää valita editorissa.

manninen [01.03.2011 11:42:05]

#

En, mistä tämän saa tarkistettu PsPad - editorista?

makumaku [01.03.2011 11:51:30]

#

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.

manninen [01.03.2011 12:02:02]

#

Onko sinulla PsPad, ei ihan nuin tapahdu siinä.

Mutta näytti olevan käytössä formaatti ANSI

makumaku [01.03.2011 12:08:12]

#

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

manninen [01.03.2011 16:43:34]

#

Joo, löysin jo aikaisemmin mistä muutetaan, mutta ihan niin ei mennyt kun aluksi meinasit.

PS. Kiitoksia kaikille! On mukava oppia aina jotain uutta :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta