Korjaa oudot merkit MySQL:ssä ja phpMyAdminissa

Näyttääkö phpMyAdmin, SQL-vedos tai sovelluksesi ä tai ? merkin ä sijaan? Yleensä taulu, yhteys ja tuonti eivät vastaa toisiaan. Mojibuster korjaa viennit suoraan selaimessa – sen jälkeen asetat MySQL:n kuntoon pysyvästi.

Toimii tekstin ja näiden tiedostojen kanssa:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Esimerkiksi Excel-viennit, tietokantavarmuuskopiot, tekstitykset tai verkkosivujen koodi.

Korjaa

  1. Pudota tiedosto tai liitä teksti
  2. Korjaus tapahtuu automaattisesti
  3. Kopioi tai lataa
tai pudota tiedosto tähän

Kolme paikkaa, joissa MySQL tarvitsee merkistön

  • Sarake tai taulu: merkistö, jolla tiedot tallennetaan, esimerkiksi utf8mb4 tai latin1.
  • Yhteys: merkistö, jolla asiakas ja palvelin keskustelevat – asetetaan komennolla SET NAMES utf8mb4 tai 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 ä.

Rivi phpMyAdminin CSV-viennistä

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-sarakkeessa C3A4 on ä, kun taas C383C2A4 on jo rikkoutunut ä.

Korjaa vienti tai vedos

  1. Vie taulu phpMyAdminissa SQL- tai CSV-muodossa – tai komennolla mysqldump --default-character-set=utf8mb4.
  2. Pudota tiedosto yllä olevaan ruutuun. Mojibuster korjaa vain rikkinäiset kohdat; oikeat merkit säilyvät ennallaan.
  3. Tarkista korjatut kohdat kohdasta Mitä muuttui? ja lataa tiedosto.
  4. Tuo se utf8mb4-tauluun ja valitse tuontiruudussa merkistöksi utf-8.
  5. 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_ci tai utf8mb4_unicode_ci.
  • Aseta sovelluksesi yhteys arvoon utf8mb4, PHP:ssä esimerkiksi charset=utf8mb4 PDO-DSN:ssä.
  • Jos latin1-sarakkeessa on UTF-8-tavuja, älä muunna sitä suoraan komennolla CONVERT TO – silloin ne koodataan toisen kerran ja syntyy kahteen kertaan koodattua tekstiä, ks. mikä on mojibake. Turvallinen tie kulkee binäärityypin kautta: ensin MODIFY nimi VARBINARY(255), sitten MODIFY 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.

Lue lisää