Tre steder der MySQL trenger en tegnkoding
- Kolonne eller tabell: tegnsettet dataene lagres i, for eksempel
utf8mb4ellerlatin1. - Tilkobling: tegnsettet klient og server snakker med – settes med
SET NAMES utf8mb4eller i tilkoblingsinnstillingene. - Fil: kodingen en import leses eller en eksport skrives med – i phpMyAdmin under Filens tegnsett (Character set of the file).
Passer ikke de tre sammen, går tegnene i stykker. Vanligste tilfelle: UTF-8-tekst ble skrevet over en latin1-tilkobling til en latin1-kolonne. Programmet ser fint ut, men phpMyAdmin og eksporten viser ø.
Før
"1","Bjørn Æreberg","Åsveien 12","Tromsø"
Etter
"1","Bjørn Æreberg","Åsveien 12","Tromsø"
Sjekk tegnsettene
SHOW VARIABLES LIKE 'character_set%';viser innstillingene for server og tilkobling.SHOW CREATE TABLE kunder;viser tegnsettet til tabellen og kolonnene.SELECT navn, HEX(navn) FROM kunder LIMIT 5;viser de faktiske bytene: i enutf8mb4-kolonne erC3B8enø, mensC383C2B8er en allerede ødelagtø.
Fiks en eksport eller dump
- Eksporter tabellen i phpMyAdmin som SQL eller CSV – eller med
mysqldump --default-character-set=utf8mb4. - Slipp filen i feltet ovenfor. Mojibuster fikser bare de ødelagte stedene; riktige tegn blir stående urørt.
- Kontroller de fikste stedene under Hva ble endret? og last ned filen.
- Importer den i en tabell med
utf8mb4, og velgutf-8som tegnsett i importdialogen. - Test først på en kopi før du erstatter den ekte tabellen.
Eksporten forlater aldri datamaskinen din – viktig når det gjelder kundedata. Mer om UTF-8-feil generelt finner du på siden fiks UTF-8-tegn.
Fjern årsaken
- Opprett nye tabeller med
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci. - Sett tilkoblingen i programmet til
utf8mb4, i PHP for eksempel medcharset=utf8mb4i PDO-DSN-et. - Ligger UTF-8-byte i en
latin1-kolonne, må du ikke konvertere den direkte medCONVERT TO– da kodes de én gang til og du får dobbeltkodet tekst, se hva er mojibake. Den trygge veien går via en binær type: førstMODIFY navn VARBINARY(255), deretterMODIFY navn VARCHAR(255) CHARACTER SET utf8mb4. - Erstatter MySQL tegn med
?, kan ikke kolonnen eller tilkoblingen representere dem. Det som allerede er lagret slik, er tapt – mer under spørsmålstegn i stedet for bokstaver.
Ofte stilte spørsmål
Hvorfor ser alt riktig ut i programmet mitt, men ikke i phpMyAdmin?
Fordi program og database gjør samme feil to ganger: programmet skriver UTF-8 over en latin1-tilkobling og leser det tilbake på samme måte. phpMyAdmin kobler til riktig og viser derfor det som faktisk er lagret. Står det ø i en hel WordPress-eksport, hjelper siden om WordPress og database, og ligger feilen allerede i dobbel koding, kan du rette begge nivåene samtidig.
Hvilken collation bør jeg bruke?
utf8mb4_unicode_ci passer for de fleste programmer; fra MySQL 8 er utf8mb4_0900_ai_ci standard. Viktigst er tegnsettet utf8mb4 – ikke utf8, som i MySQL ikke kan lagre emojier.
Fungerer det også med MariaDB?
Ja. MariaDB håndterer tegnsett som MySQL, og kommandoene er de samme.
Hvor stor kan dumpen være?
Opptil 100 MB per fil. Eksporter større databaser tabell for tabell.