Tre steder, hvor MySQL har brug for en kodning
- Kolonne eller tabel: tegnsættet, dataene gemmes i, fx
utf8mb4ellerlatin1. - Forbindelse: tegnsættet, klient og server taler i – sættes med
SET NAMES utf8mb4eller i forbindelsesindstillingerne. - Fil: kodningen, en import læses eller en eksport skrives med – i phpMyAdmin under Filens tegnsæt (Character set of the file).
Passer de tre ikke sammen, går tegnene i stykker. Det hyppigste tilfælde: UTF-8-tekst blev skrevet over en latin1-forbindelse til en latin1-kolonne. Programmet ser fint ud, men phpMyAdmin og eksporten viser ø.
Før
"1","Søren Ærø","Åboulevarden 12","Århus"
Efter
"1","Søren Ærø","Åboulevarden 12","Århus"
Tjek tegnsættene
SHOW VARIABLES LIKE 'character_set%';viser indstillingerne for server og forbindelse.SHOW CREATE TABLE kunder;viser tegnsættet for tabellen og dens kolonner.SELECT navn, HEX(navn) FROM kunder LIMIT 5;viser de egentlige bytes: i enutf8mb4-kolonne erC3B8etø, mensC383C2B8er et allerede ødelagtø.
Ret en eksport eller et dump
- Eksportér tabellen i phpMyAdmin som SQL eller CSV – eller med
mysqldump --default-character-set=utf8mb4. - Slip filen i feltet ovenfor. Mojibuster retter kun de ødelagte steder; korrekte tegn forbliver uændrede.
- Kontrollér de rettede steder under Hvad blev ændret? og download filen.
- Importér den i en tabel med
utf8mb4, og vælgutf-8som tegnsæt i importdialogen. - Test først på en kopi, før du erstatter den rigtige tabel.
Eksporten forlader aldrig din computer – vigtigt, når det gælder kundedata. Mere om UTF-8-fejl generelt finder du på siden ret UTF-8-tegn.
Fjern årsagen
- Opret nye tabeller med
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_danish_ciellerutf8mb4_unicode_ci. - Sæt programmets forbindelse til
utf8mb4, i PHP fx medcharset=utf8mb4i PDO-DSN. - Ligger UTF-8-bytes i en
latin1-kolonne, så konvertér den ikke direkte medCONVERT TO– det koder dem endnu en gang og giver dobbeltkodet tekst, se hvad er mojibake. Den sikre vej går via en binær type: førstMODIFY navn VARBINARY(255), derefterMODIFY navn VARCHAR(255) CHARACTER SET utf8mb4. - Erstatter MySQL tegn med
?, kan kolonnen eller forbindelsen ikke rumme dem. Det, der allerede er gemt sådan, er tabt – mere under spørgsmålstegn i stedet for bogstaver.
Ofte stillede spørgsmål
Hvorfor ser alt rigtigt ud i mit program, men ikke i phpMyAdmin?
Fordi program og database begår den samme fejl to gange: programmet skriver UTF-8 over en latin1-forbindelse og læser det tilbage på samme måde. phpMyAdmin forbinder korrekt og viser derfor det, der virkelig er gemt. Ligger fejlen allerede i en WordPress-eksport, kan du læse mere under WordPress og database og om dobbeltkodet tekst.
Hvilken collation skal jeg bruge?
utf8mb4_danish_ci giver dansk sortering (æ, ø, å til sidst i alfabetet), utf8mb4_unicode_ci passer til de fleste andre programmer. Tegnsættet utf8mb4 er vigtigst – ikke utf8, som i MySQL ikke kan gemme emojis.
Virker det også med MariaDB?
Ja. MariaDB håndterer tegnsæt som MySQL, og kommandoerne er de samme.
Hvor stort må dumpet være?
Op til 100 MB pr. fil. Eksportér større databaser tabel for tabel.