Simply.com is available in english

Charset og collation på en MySQL-database

Charset (tegnsæt) bestemmer hvilke tegn databasen kan gemme, og collation bestemmer hvordan tegnene sammenlignes og sorteres. Forkert charset er den hyppigste årsag til at danske bogstaver (æ, ø, å) eller emojis vises som spørgsmålstegn eller mojibake (f.eks. æ i stedet for æ).

Anbefalede værdier

Brug utf8mb4 som charset og utf8mb4_unicode_ci som collation. utf8mb4 understøtter alle Unicode-tegn inklusive emojis.

Metode 1: phpMyAdmin

Skift standard for hele databasen (gælder kun nye tabeller):

  1. Log ind på phpMyAdmin og vælg databasen i venstre side.
  2. Klik på fanen Operationer.
  3. Find sektionen Sortering (Collation).
  4. Vælg utf8mb4_unicode_ci i dropdown-menuen.
  5. Klik Udfør.

Skift en eksisterende tabel (inklusive alle dens kolonner):

  1. Vælg tabellen i venstre side.
  2. Klik på fanen Operationer.
  3. Under Tabelvalgmuligheder vælges ny sortering.
  4. Sæt flueben i Skift også sortering for alle kolonner.
  5. Klik Udfør.

Metode 2: SQL

Skift databasens standard:

ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Skift en tabel og alle dens kolonner:

ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

I phpMyAdmin kan du ændre charset per kolonne: vælg tabellen, klik Struktur, klik Skift ud for kolonnen, og vælg ny sortering i kolonnedefinitionen.

Konverter alle tabeller på én gang

Generér ALTER-kommandoerne automatisk:

SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';

Kør resultatet i phpMyAdmin under fanen SQL eller via kommandolinjen.

Forbindelsens charset (SET NAMES)

Database-charset og forbindelses-charset er to forskellige ting. Selv hvis dine tabeller er korrekt sat til utf8mb4, kan tegn blive korrupte i transit, hvis forbindelsen mellem applikation og MySQL bruger et andet charset.

SET NAMES utf8mb4 sætter tre session-variabler på én gang:

  • character_set_client — hvad serveren forventer at modtage fra klienten
  • character_set_connection — hvad serveren bruger internt under query-behandling
  • character_set_results — hvad serveren sender tilbage til klienten
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

Bedre praksis: brug driverens indbyggede charset-option i stedet for at sende SET NAMES manuelt. Det sikrer, at også funktioner som mysqli_real_escape_string() og PDO::quote() bruger det rigtige charset — ellers kan du i sjældne tilfælde åbne for SQL-injection.

Artikel fra support-kategorien: MySQL