Kolme paikkaa, joissa MySQL tarvitsee merkistön
- Sarake tai taulu: merkistö, jolla tiedot tallennetaan, esimerkiksi
utf8mb4tailatin1. - Yhteys: merkistö, jolla asiakas ja palvelin keskustelevat – asetetaan komennolla
SET NAMES utf8mb4tai yhteysasetuksissa. - Tiedosto: merkistö, jolla tuonti luetaan tai vienti kirjoitetaan – phpMyAdminissa kohdassa Tiedoston merkistö (Character set of the file).
Jos nämä kolme eivät täsmää, merkit hajoavat. Yleisin tapaus: UTF-8-teksti kirjoitettiin latin1-yhteyden yli latin1-sarakkeeseen. Sovellus näyttää hyvältä, mutta phpMyAdmin ja vienti näyttävät ä.
Ennen
"1","Päivi Ääläinen","Käpylänkatu 12","Jyväskylä"
Jälkeen
"1","Päivi Ääläinen","Käpylänkatu 12","Jyväskylä"
Tarkista merkistöt
SHOW VARIABLES LIKE 'character_set%';näyttää palvelimen ja yhteyden asetukset.SHOW CREATE TABLE asiakkaat;näyttää taulun ja sen sarakkeiden merkistön.SELECT nimi, HEX(nimi) FROM asiakkaat LIMIT 5;näyttää todelliset tavut:utf8mb4-sarakkeessaC3A4onä, kun taasC383C2A4on jo rikkoutunutä.
Korjaa vienti tai vedos
- Vie taulu phpMyAdminissa SQL- tai CSV-muodossa – tai komennolla
mysqldump --default-character-set=utf8mb4. - Pudota tiedosto yllä olevaan ruutuun. Mojibuster korjaa vain rikkinäiset kohdat; oikeat merkit säilyvät ennallaan.
- Tarkista korjatut kohdat kohdasta Mitä muuttui? ja lataa tiedosto.
- Tuo se
utf8mb4-tauluun ja valitse tuontiruudussa merkistöksiutf-8. - Kokeile ensin kopiolla, ennen kuin korvaat oikean taulun.
Vienti ei koskaan poistu koneeltasi – tärkeää asiakastietojen kohdalla. Lisää UTF-8-virheistä yleisesti sivulla korjaa UTF-8-merkit.
Poista syy
- Luo uudet taulut asetuksilla
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_swedish_citaiutf8mb4_unicode_ci. - Aseta sovelluksesi yhteys arvoon
utf8mb4, PHP:ssä esimerkiksicharset=utf8mb4PDO-DSN:ssä. - Jos
latin1-sarakkeessa on UTF-8-tavuja, älä muunna sitä suoraan komennollaCONVERT TO– silloin ne koodataan toisen kerran ja syntyy kahteen kertaan koodattua tekstiä, ks. mikä on mojibake. Turvallinen tie kulkee binäärityypin kautta: ensinMODIFY nimi VARBINARY(255), sittenMODIFY nimi VARCHAR(255) CHARACTER SET utf8mb4. - Jos MySQL korvaa merkit
?-merkeillä, sarake tai yhteys ei pysty esittämään niitä. Näin tallentunut tieto on menetetty – lisää kohdassa kysymysmerkit kirjainten sijaan.
Usein kysyttyä
Miksi kaikki näyttää sovelluksessani oikealta mutta ei phpMyAdminissa?
Koska sovellus ja tietokanta tekevät saman virheen kahdesti: sovellus kirjoittaa UTF-8:aa latin1-yhteyden yli ja lukee sen takaisin samalla tavalla. phpMyAdmin yhdistää oikein ja näyttää siksi sen, mitä todella on tallennettu. Jos koko WordPress-viennissä lukee ä, apua on sivulta WordPress ja tietokanta, ja jos virhe on jo kaksinkertaisessa koodauksessa, molemmat tasot voi korjata kerralla.
Mitä collationia minun kannattaa käyttää?
utf8mb4_swedish_ci lajittelee ääkköset suomalaisittain (å, ä, ö aakkosten lopussa), utf8mb4_unicode_ci sopii useimpiin muihin sovelluksiin. Tärkeintä on merkistö utf8mb4 – ei utf8, joka ei MySQL:ssä pysty tallentamaan emojeja.
Toimiiko tämä myös MariaDB:n kanssa?
Kyllä. MariaDB käsittelee merkistöt kuten MySQL, ja komennot ovat samat.
Kuinka suuri vedos saa olla?
Enintään 100 Mt tiedostoa kohden. Vie suuremmat tietokannat taulu kerrallaan.