Fiks rare tegn i MySQL og phpMyAdmin

Viser phpMyAdmin, SQL-dumpen eller programmet ditt ø eller ? i stedet for ø? Som regel passer ikke tabell, tilkobling og import sammen. Mojibuster fikser eksporter direkte i nettleseren – deretter stiller du inn MySQL riktig én gang for alle.

Fungerer med tekst og med disse filene:

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

For eksempel eksporter fra Excel, databasesikkerhetskopier, undertekster eller kode fra nettsider.

Fiks

  1. Dra en fil hit eller lim inn tekst
  2. Fiksingen skjer automatisk
  3. Kopier eller last ned
eller dra en fil hit

Tre steder der MySQL trenger en tegnkoding

  • Kolonne eller tabell: tegnsettet dataene lagres i, for eksempel utf8mb4 eller latin1.
  • Tilkobling: tegnsettet klient og server snakker med – settes med SET NAMES utf8mb4 eller 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 ø.

En rad fra en CSV-eksport i phpMyAdmin

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 en utf8mb4-kolonne er C3B8 en ø, mens C383C2B8 er en allerede ødelagt ø.

Fiks en eksport eller dump

  1. Eksporter tabellen i phpMyAdmin som SQL eller CSV – eller med mysqldump --default-character-set=utf8mb4.
  2. Slipp filen i feltet ovenfor. Mojibuster fikser bare de ødelagte stedene; riktige tegn blir stående urørt.
  3. Kontroller de fikste stedene under Hva ble endret? og last ned filen.
  4. Importer den i en tabell med utf8mb4, og velg utf-8 som tegnsett i importdialogen.
  5. 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 med charset=utf8mb4 i PDO-DSN-et.
  • Ligger UTF-8-byte i en latin1-kolonne, må du ikke konvertere den direkte med CONVERT 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ørst MODIFY navn VARBINARY(255), deretter MODIFY 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.

Les mer