Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Merkkien korvaus MySQL-tietokannassa

Anda [01.02.2008 00:50:48]

#

Olen siis täysi nyyppä tietokantojen kanssa, eikä googlaus oikein tuottanut toivottua tulosta.

Minulla on siis MySQL-tietokanta, josta sekosivat ääkköset. Hallintapaneeli antaa kyllä ottaa varmuuskopion, muttei palauttaa sitä, joten en voi korjata ääkkösiä oman koneen tekstieditorissa ja palauttaa sitten varmuuskopiota. Merkistöt ovat oikein, eli sen vaihtaminen ei myöskään auta.

Miten saisin korvattua tietokannan tauluista tietyt kirjainyhdistelmät toisilla? Onko tähän jokin erityinen lauseke? Käytössä on PhpMyAdmin, sieltä oletettavasti pystyy tavalla tai toisella käskyttämään tietokantaa komentojen avulla?

Kiitos kaunis.

Merri [01.02.2008 01:09:20]

#

Millä tavalla ääkköset ovat seonneet? Sivuilla oleva sisältö näkyy väärin? UTF-8?

Anda [01.02.2008 01:27:52]

#

Homma meni niin, että tietokantaa käyttävä softa meni ilmeisesti serveristä johtuvista syistä täysin tileen, jolloin tietokannasta jouduttiin ottamaan varmuuskopio ja palauttamaan se myöhemmin.

(Aluksi kyllä koetettiin korjata itse softaongelmaa; sama ongelma alkoi ilmetä muillakin saman serverin softilla. Tästä käytiin pitkät keskustelut softan kehittäjien ja serverin ylläpidon kanssa ja tultiin siihen lopputulokseen, että vian on täytynyt johtua serveristä - miten sitten, se jäi minulle arvoitukseksi. Ongelmaa ei voinut korjata odottelemalla (vika ei siis ollut ohimenevää laatua), ja ainoaksi vaihtoehdoksi näytti jäävän softan uudelleenasennus. Se toimikin, mutta varmuuskopio täytyi palauttaa omalta koneelta. Tällöin ilmestyi ääkkösongelma. Kun ääkkösongelma havaittiin, varmuuskopion ääkköset korjattiin tekstieditorissa ja yritettiin palauttaa sitten tietokantaan; tässä vaiheessa koko systeemi leikkasi kiinni. Koetettiin pyytää serverin puolelta varmuuskopioiden palautuksia, mutta heillä ei ollut kuin nämä huonoääkköselliset versiot.)

Ääkköset sekosivat tällä perinteisellä UTF-8:n tyylillä (ä -> ä jne.), mutta niin tietokanta kuin kaikki sen taulutkin sekä softa (kuten myös www-sivut, joilla tietokannasta ongittua tietoa näkyy) käyttävät UTF-8:aa. Softan tietokantaan viskaamat uudet tekstit näkyvät ok, niissä siis ääkköset toimivat. Koska tietokanta ei anna palauttaa uusia varmuuskopioita, eikä tietokannan taulujen merkistön muuttaminen auta (sitä on kokeiltu), ainoaksi vaihtoehdoksi näyttäisi jäävän noiden seonneiden merkkien korvaaminen suoraan oikeilla. Tavalliset (ja uudet) utf-8:n ääkköset kun näyttäisivät pelittävän hyvin. Tietokannan nykyinen merkistö on siis utf-8, ja merkistö oli sama myös ennen tätä kaatuiluepisodia. Myöskänä softien merkistöt eivät ole muuttuneet.

Haussa olisi siis jokin kikka, jolla tietokannan tauluista saisi korvattua merkkijonoja - tässä tapauksessa seonneita ääkkösiä - toisilla. Luulisi onnistuvan, mutta miten?

Merri [01.02.2008 01:50:41]

#

Tietokantaa palauttaessa varmuuskopiosta tulee määrittää, että käytetään UTF-8:aa. Esimerkiksi shellin kautta palautettaessa täytyy määrittää --default-character-set=utf8

Jos tietokanta palautettiin jonkun toisen toimesta, kerro että näin pitää tehdä. Tämän pitäisi poistaa UTF-8:n tuplaenkoodausongelma.


Kokemuksesta voin sanoa, että ei kannata lähteä korvaamaan merkistöä tietokannasta millään muilla tavoin. Se vaan rikkoo enemmän kuin korjaa. Ja säästää paljon tunteja kun palauttaa tietokannan oikealla tavalla.

Antti Laaksonen [01.02.2008 20:44:53]

#

Funktiolla REPLACE voi korvata merkkijonoja toisella. Tämän funktion voi yhdistää UPDATE-komentoon ja kohdistaa esim. taulun kaikkiin riveihin.

Esimerkkitaulun (rivit) lähtötilanne:

teksti
----------
apina
banaani
cembalo

Esimerkkikysely:

UPDATE rivit SET teksti = REPLACE(teksti, 'a', 'A')

Taulun sisältö kyselyn suorituksen jälkeen:

teksti
----------
ApinA
bAnAAni
cembAlo

Tuohon kyselyyn voi toki liittää WHERE-ehdon, jotta muutos kohdistuu vain tiettyihin riveihin. Tämän jälkeen ongelmana on vielä, miten vääränmuotoiset ääkköset saa ilmaistua REPLACE-funktion ymmärtämässä muodossa.

Toivottavasti saat tietokannan kuntoon, mutta ota tietokannasta ensin varmuuskopio, koska UPDATE-komennolla voi saada paljon tuhoa aikaan.

Anda [03.02.2008 23:40:00]

#

Merri, tässä oli vielä se mutka matkassa, että korjattujen varmuuskopioiden palautus ei ottanut onnistuakseen useammankaan yrittämän jälkeen. Tämä olisi kyllä ollut se ykkösvaihtoehto ongelman korjauksessa, jos koko homma ei olisi leikannut kiinni.

Homma saatiin kuitenkin toimimaan Antin neuvojen mukaan, iso kiitos siitä. Noiden rivien kanssa piti kyllä olla varovainen, mutta onneksi mitään vahinkoa ei päässyt tapahtumaan.

Merri [04.02.2008 01:39:17]

#

Anda: se "korjattujen" varmuuskopioiden palautus ei onnistunut, koska ne olivat alunperin oikeassa muodossa. Jos tietokanta on UTF-8:aa, niin tietokannan varmuuskopiot ovat kaksinkertaisella UTF-8:lla, ja silloin täysin oikein. Eli kun ottaa varmuuskopion tietokannasta, niin sille ei kannata tehdä yhtään mitään toimenpiteitä, jos haluaa että palautus onnistuu.

Vastaus

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

Tietoa sivustosta