Tre ställen där MySQL behöver en teckenkodning
- Kolumn eller tabell: teckenuppsättningen som data lagras i, till exempel
utf8mb4ellerlatin1. - Anslutning: teckenuppsättningen som klient och server pratar med – sätts med
SET NAMES utf8mb4eller i anslutningsinställningarna. - Fil: kodningen som används när en import läses eller en export skrivs – i phpMyAdmin under Teckenuppsättning för filen (Character set of the file).
Om de tre inte stämmer överens går tecknen sönder. Vanligast: UTF-8-text skrevs över en latin1-anslutning till en latin1-kolumn. Programmet ser bra ut, men phpMyAdmin och exporten visar ä.
Före
"1","Åsa Björk","Älvvägen 12","Göteborg"
Efter
"1","Åsa Björk","Älvvägen 12","Göteborg"
Kontrollera teckenuppsättningarna
SHOW VARIABLES LIKE 'character_set%';visar inställningarna för server och anslutning.SHOW CREATE TABLE kunder;visar teckenuppsättningen för tabellen och dess kolumner.SELECT namn, HEX(namn) FROM kunder LIMIT 5;visar de verkliga byten: i enutf8mb4-kolumn ärC3A4että, medanC383C2A4är ett redan trasigtä.
Laga en export eller dump
- Exportera tabellen i phpMyAdmin som SQL eller CSV – eller med
mysqldump --default-character-set=utf8mb4. - Släpp filen i rutan ovan. Mojibuster lagar bara de trasiga ställena; korrekta tecken lämnas orörda.
- Kontrollera de lagade ställena under Vad ändrades? och ladda ner filen.
- Importera den till en tabell med
utf8mb4och väljutf-8som teckenuppsättning i importdialogen. - Testa först på en kopia innan du ersätter den riktiga tabellen.
Exporten lämnar aldrig din dator – viktigt när det gäller kunduppgifter. Hur du fixar UTF-8-fel i allmänhet står på sidan fixa UTF-8-tecken.
Åtgärda orsaken
- Skapa nya tabeller med
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_swedish_ciellerutf8mb4_unicode_ci. - Ställ in programmets anslutning på
utf8mb4, i PHP till exempel medcharset=utf8mb4i PDO-DSN:et. - Ligger UTF-8-byten i en
latin1-kolumn: konvertera den inte direkt medCONVERT TO– då kodas de en gång till och du får dubbelkodad text, se vad är mojibake. Det säkra sättet går via en binär typ: förstMODIFY namn VARBINARY(255), sedanMODIFY namn VARCHAR(255) CHARACTER SET utf8mb4. - Ersätter MySQL tecken med
?kan kolumnen eller anslutningen inte representera dem. Det som redan lagrats så är förlorat – mer under frågetecken i stället för åäö.
Vanliga frågor
Varför ser allt rätt ut i mitt program men inte i phpMyAdmin?
Programmet och databasen gör samma fel två gånger: programmet skriver UTF-8 över en latin1-anslutning och läser tillbaka det på samma sätt. phpMyAdmin ansluter rätt och visar därför det som verkligen är lagrat. Ligger felet redan i en WordPress-export finns mer på sidan om WordPress och databas och om dubbelkodad text.
Vilken kollation ska jag använda?
utf8mb4_swedish_ci ger svensk sortering (å, ä, ö sist i alfabetet), utf8mb4_unicode_ci passar de flesta andra program. Viktigast är teckenuppsättningen utf8mb4 – inte utf8, som i MySQL inte kan lagra emojis.
Fungerar det med MariaDB också?
Ja. MariaDB hanterar teckenuppsättningar som MySQL, och kommandona är desamma.
Hur stor får dumpen vara?
Upp till 100 MB per fil. Exportera större databaser tabell för tabell.