MySQL-Zeichensatz-Änderungsleitfaden: Umwandlung zu utf8mb4 (Mojibake beheben)

目次

1. Einführung

Warum Sie das MySQL‑Zeichensatz ändern müssen

Ein Datenbank‑Zeichensatz ist eine wichtige Einstellung, die bestimmt, wie Textdaten kodiert und für die Speicherung verarbeitet werden. In MySQL ist der Standard‑Zeichensatz häufig latin1, was bei der Arbeit mit Japanisch oder anderen Sonderzeichen Probleme verursachen kann. Besonders bei Datenmigrationen oder Systemstandardisierungen wird das Umschalten auf einen geeigneten Zeichensatz unverzichtbar.

Häufige Probleme und ihre Ursachen

Typische Probleme im Zusammenhang mit MySQL‑Zeichensätzen umfassen die folgenden.

  1. Mojibake (verfälschte Zeichen)
  • utf8 und latin1 werden in derselben Umgebung gemischt
  • Die Client‑ und Server‑Zeichensatz‑Einstellungen stimmen nicht überein
  1. Probleme bei der Suche
  • Aufgrund von Kollations‑Unterschieden werden die erwarteten Suchergebnisse nicht zurückgeliefert
  • Die Sortierreihenfolge weicht von Ihren Erwartungen ab
  1. Probleme bei der Datenmigration
  • Emoji und Sonderzeichen können nicht gespeichert werden, weil utf8mb4 nicht verwendet wird
  • Die Zeichensatz‑Konvertierung wird beim Export/Import nicht korrekt behandelt

Ziele und Aufbau des Artikels

Dieser Artikel liefert eine umfassende Erklärung zu MySQL‑Zeichensatz‑Änderungen – von grundlegenden Konzepten über wie man Einstellungen ändert bis hin zu Fehlerbehebung.

Gliederung

  1. Grundwissen zu MySQL‑Zeichensätzen
  2. Wie man den aktuellen Zeichensatz prüft
  3. Wie man den MySQL‑Zeichensatz ändert
  4. Fehlerbehebung nach der Änderung
  5. Wie Zeichensatz‑Änderungen die Performance beeinflussen
  6. Empfohlene Einstellungen (Best Practices)
  7. FAQ (häufig gestellte Fragen)

Durch das Lesen dieses Leitfadens vertiefen Sie Ihr Verständnis für MySQL‑Zeichensätze und können die richtigen Einstellungen wählen und gängige Probleme vermeiden.

2. Was ist ein MySQL‑Zeichensatz? Grundlagen verstehen

Was ist ein Zeichensatz?

Ein Zeichensatz (Character Set) ist ein Regelwerk, das zur Speicherung und Verarbeitung von Zeichen als digitale Daten verwendet wird. Beispiel: Beim Speichern des japanischen Zeichens „あ“ repräsentiert UTF‑8 es als Byte‑Sequenz E3 81 82, während Shift_JIS 82 A0 nutzt.

In MySQL können Sie unterschiedliche Zeichensätze auf Datenbank‑ oder Tabellenebene festlegen. Durch die Wahl eines passenden Zeichensatzes können Sie Mojibake verhindern und die Internationalisierung reibungsloser gestalten.

Häufige Zeichensätze

Character SetCharacteristicsUse Case
utf8UTF-8 up to 3 bytesDoes not support some special characters (such as emoji)
utf8mb4UTF-8 up to 4 bytesSupports emoji and special characters (recommended)
latin1ASCII-compatibleUsed in older systems

Was ist Kollation?

Kollation ist das Regelwerk, das zum Vergleichen und Sortieren von Daten innerhalb eines Zeichensatzes verwendet wird. Sie definiert beispielsweise, ob „A“ und „a“ als dasselbe Zeichen behandelt werden und wie die Reihenfolge bestimmt wird.

Häufig genutzte Kollationen

CollationDescription
utf8_general_ciCase-insensitive, suitable for general use
utf8_unicode_ciUnicode-based collation (recommended)
utf8mb4_binBinary comparison (use when exact matches are required)

Unterschiede zwischen utf8 und utf8mb4

MySQLs utf8 kann tatsächlich nur bis zu 3 Byte pro Zeichen speichern, sodass bestimmte Sonderzeichen (wie Emoji oder einige erweiterte CJK‑Zeichen) nicht verarbeitet werden können. Im Gegensatz dazu unterstützt utf8mb4 bis zu 4 Byte pro Zeichen, weshalb moderne Anwendungen empfohlen wird, utf8mb4 zu verwenden.

Character SetMax BytesEmoji SupportRecommendation
utf83 bytes❌ Not supported❌ Not recommended
utf8mb44 bytes✅ Supported✅ Recommended

Warum Sie von utf8 zu utf8mb4 wechseln sollten

  1. Zukunftssicherheit: Moderne Systeme standardisieren zunehmend auf utf8mb4.
  2. Speichern von Sonderzeichen und Emoji: Mit utf8mb4 können Sie Daten aus SNS‑Posts und Messaging‑Apps sicher handhaben.
  3. Internationalisierung: Für mehrsprachige Systeme reduziert es das Risiko von Mojibake.

Zusammenfassung

  • Zeichensatz bestimmt, wie Daten gespeichert und verarbeitet werden.
  • Kollation bestimmt, wie Zeichen verglichen werden.
  • MySQLs utf8 ist auf 3 Byte begrenzt, daher wird utf8mb4 empfohlen.
  • utf8mb4_unicode_ci ist eine häufig empfohlene Kollation für den allgemeinen Gebrauch.

3. Wie man den aktuellen Zeichensatz prüft

Bevor Sie den MySQL‑Zeichensatz ändern, ist es wichtig, die aktuellen Einstellungen zu überprüfen.
Da Zeichensätze auf mehreren Ebenen (Datenbank, Tabelle, Spalte) festgelegt werden können, sollten Sie genau verstehen, wo Änderungen nötig sind.

Wie man den aktuellen Zeichensatz prüft

Prüfen des MySQL‑Server‑weiten Zeichensatzes

First, check the default character set and collation settings for the entire MySQL server.

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

Beispielausgabe:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                        |
+--------------------------+----------------------------+

Zeichensatz pro Datenbank prüfen

Um den Zeichensatz einer bestimmten Datenbank zu prüfen, verwenden Sie die folgende Abfrage.

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';

Beispielausgabe

+----------------+----------------------+----------------------+
| SCHEMA_NAME    | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------+----------------------+----------------------+
| my_database   | utf8mb4               | utf8mb4_unicode_ci   |
+----------------+----------------------+----------------------+

Zeichensatz einer Tabelle prüfen

So prüfen Sie den Zeichensatz einer bestimmten Tabelle.

SHOW CREATE TABLE table_name;

Beispielausgabe

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

Kontrollpunkte

  • DEFAULT CHARSET=latin1 → Nicht utf8mb4, daher ist eine Änderung erforderlich
  • COLLATE=latin1_swedish_ci → Das Umstellen auf utf8mb4_unicode_ci ist in der Regel geeigneter

Zeichensatz einer Spalte prüfen

Um den Zeichensatz auf Spaltenebene zu untersuchen, führen Sie das folgende SQL aus.

SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'database_name' 
AND TABLE_NAME = 'table_name';

Beispielausgabe

+-------------+--------------------+----------------------+
| COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME       |
+-------------+--------------------+----------------------+
| name        | latin1             | latin1_swedish_ci    |
| email       | utf8mb4            | utf8mb4_unicode_ci   |
+-------------+--------------------+----------------------+

In diesem Beispiel verwendet die Spalte name latin1; es wird empfohlen, sie zu utf8mb4 zu ändern.

Zusammenfassung

  • MySQL‑Zeichensätze werden auf mehreren Ebenen konfiguriert (Server, Datenbank, Tabelle, Spalte).
  • Durch das Prüfen des Zeichensatzes auf jeder Ebene können Sie die richtigen Änderungen vornehmen.
  • Verwenden Sie Befehle wie SHOW VARIABLES und SHOW CREATE TABLE, um die aktuelle Konfiguration vollständig zu verstehen.

4. Wie man den MySQL‑Zeichensatz ändert

Durch das korrekte Anpassen des MySQL‑Zeichensatzes können Sie Mojibake verhindern und mehrsprachige Daten reibungsloser unterstützen.
In diesem Abschnitt erklären wir, wie Sie die Einstellungen auf jeder Ebene aktualisieren: serverweit, Datenbank, Tabelle und Spalte.

Serverweiten Standard‑Zeichensatz ändern

Um den serverweiten Standard‑Zeichensatz zu ändern, müssen Sie die MySQL‑Konfigurationsdatei (my.cnf oder my.ini) bearbeiten.

Schritte

  1. Öffnen Sie die Konfigurationsdatei
  • Unter Linux: bash sudo nano /etc/mysql/my.cnf
  • Unter Windows: wp:list /wp:list

    • Öffnen Sie C:\ProgramData\MySQL\MySQL Server X.X\my.ini
  1. Zeichensatz‑Einstellungen hinzufügen oder ändern Fügen Sie die folgenden Zeilen im Abschnitt mysqld hinzu oder aktualisieren Sie sie.
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    
  1. MySQL neu starten
    sudo systemctl restart mysql
    

Unter Windows:

net stop MySQL && net start MySQL
  1. Änderung überprüfen
    SHOW VARIABLES LIKE 'character_set_server';
    

Zeichensatz auf Datenbankebene ändern

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Änderung überprüfen

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME 
FROM information_schema.SCHEMATA 
WHERE SCHEMA_NAME = 'mydatabase';

Zeichensatz auf Tabellenebene ändern

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Änderung überprüfen

SHOW CREATE TABLE users;

Zeichensatz auf Spaltenebene ändern

ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Änderung überprüfen

SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'mydatabase' 
AND TABLE_NAME = 'users';

Überprüfung nach der Änderung und die Bedeutung von Backups

Um die Datenintegrität nach dem Ändern des Zeichensatzes zu bewahren, folgen Sie diesen Schritten.

Sichern Sie Ihre Daten

mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql

Einstellungen erneut prüfen

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW CREATE TABLE users;

Testdaten einfügen und anzeigen

INSERT INTO users (name, email) VALUES ('Test User', 'test@example.com');
SELECT * FROM users;

Zusammenfassung

  • Serverweiter Zeichensatzwechsel : Edit my.cnf und setze character-set-server=utf8mb4
  • Datenbank‑Zeichensatzwechsel : ALTER DATABASE mydatabase CHARACTER SET utf8mb4
  • Tabellen‑Zeichensatzwechsel : ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4
  • Spalten‑Zeichensatzwechsel : ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4
  • Nach Änderungen immer die Einstellungen überprüfen und Ihre Daten testen

5. Fehlersuche nach dem Ändern des Zeichensatzes

Nach dem Ändern des MySQL‑Zeichensatzes können Fälle auftreten, in denen das System nicht korrekt funktioniert oder gespeicherte Daten beschädigt werden. In diesem Abschnitt erklären wir häufige Probleme und deren Behebung im Detail.

Ursachen von Mojibake und wie man es behebt

Wenn nach dem Ändern des Zeichensatzes Mojibake auftritt, sind die folgenden Ursachen häufig.

CauseHow to CheckSolution
The client character set setting differsSHOW VARIABLES LIKE 'character_set_client';Run SET NAMES utf8mb4;
Existing data was stored using a different encodingSELECT HEX(column_name) FROM table_name;Use CONVERT() or re-export the data
The connection encoding is not correctConnect with mysql --default-character-set=utf8mb4Adjust the client-side character set configuration
Application settings (PHP/Python, etc.) are incorrectmysqli_set_charset($conn, 'utf8mb4');Standardize the application’s character set settings

Lösung #1: Client‑Zeichensatz korrekt setzen

SET NAMES utf8mb4;

Lösung #2: Vorhandene Daten korrekt konvertieren

UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);

Hinweise beim Konvertieren von latin1 zu utf8mb4

Sicheres Vorgehen

  1. Aktuelle Daten sichern
    mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
    
  1. Datenbank‑Zeichensatz ändern
    ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. Tabellen‑Zeichensatz ändern
    ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. Daten erneut importieren
    mysql -u root -p --default-character-set=utf8mb4 mydatabase < backup.sql
    

Daten sind nach der Änderung nicht durchsuchbar

Fall #1: LIKE‑Suche funktioniert nicht

SELECT * FROM users WHERE name COLLATE utf8mb4_unicode_ci LIKE '%Tanaka%';

Fall #2: Sortierreihenfolge hat sich geändert

SELECT * FROM users ORDER BY BINARY name;

Maßnahmen auf Anwendungsebene

Für PHP

mysqli_set_charset($conn, 'utf8mb4');

Für Python (MySQL Connector)

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="mydatabase",
    charset="utf8mb4"
)

For Node.js (MySQL2)

const mysql = require('mysql2');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'mydatabase',
  charset: 'utf8mb4'
});

Summary

  • Post-change issues generally fall into three categories: client settings, data conversion, and application settings.
  • To prevent mojibake, standardize the client character set using SET NAMES utf8mb4.
  • Watch for LIKE search and sort order changes, and specify COLLATE when needed.
  • Set utf8mb4 in your application as well to avoid encoding mismatches.

6. How Character Set Changes Affect Performance

When changing the MySQL character set to utf8mb4, there are several performance considerations, such as increased storage usage and index limitations.
In this section, we explain the impact and the best countermeasures.

Increased Storage Usage

Compared to MySQL’s utf8, utf8mb4 can use up to 4 bytes per character,
so the overall table size may increase.

Max bytes per character by character set

Character SetMax Bytes per Character
latin11 byte
utf83 bytes
utf8mb44 bytes

For example, with utf8, VARCHAR(255) is up to 765 bytes (255×3),
but with utf8mb4, it becomes up to 1020 bytes (255×4).

Countermeasure

ALTER TABLE posts MODIFY COLUMN title VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Increased Index Size

MySQL enforces a maximum index key length.
After switching to utf8mb4, index entries become larger, and you may hit the limit—making indexes unusable.

Check index impact

SHOW INDEX FROM users;

Example error

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

Countermeasure

ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Impact on Query Performance

Changing the character set to utf8mb4 may affect query execution speed.

Operations that may be affected

  • LIKE searches over large datasets
  • ORDER BY processing
  • JOIN query performance

Countermeasure

CREATE INDEX idx_name ON users(name(100));

Memory Usage and Buffer Tuning

With utf8mb4, memory usage may increase.

Recommended settings

[mysqld]
innodb_buffer_pool_size = 1G
query_cache_size = 128M

Summary

  • Switching to utf8mb4 increases storage usage.
  • Index sizes increase and may exceed limits.
  • Query performance can be affected.
  • Because memory usage may increase, buffer sizes may need tuning.

7. Recommended Settings (Best Practices)

By setting MySQL character sets appropriately, you can maintain data integrity while optimizing performance.
In this section, we present recommended MySQL character set configurations and explain key points for an optimal setup.

Recommended MySQL Character Set Configuration

ItemRecommended SettingReason
Character Setutf8mb4Supports all Unicode characters including emoji and special characters
Collationutf8mb4_unicode_ciCase-insensitive and suitable for multilingual systems
Storage EngineInnoDBGood balance of performance and consistency
Indexed string lengthVARCHAR(191)Avoids exceeding MySQL index limits

Recommended my.cnf Settings

1. MySQL Server Character Set Settings

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_buffer_pool_size = 1G
query_cache_size = 128M

2. Client-Side Character Set Settings

[client]
default-character-set = utf8mb4

Recommended Database Settings

CREATE DATABASE mydatabase DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

To change an existing database character set:

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Recommended Table Settings

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Zeichensatz für vorhandene Tabellen ändern

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Unterschiede zwischen utf8mb4_general_ci und utf8mb4_unicode_ci

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, more accurate comparisonsGeneral-purpose use (recommended)

Wenn Sie mehrsprachige Unterstützung oder genaue Sortierung benötigen, wählen Sie utf8mb4_unicode_ci.

Indexoptimierung

CREATE FULLTEXT INDEX idx_fulltext ON articles(content);

Zusammenfassung

  • Die Kombination aus utf8mb4 + utf8mb4_unicode_ci wird empfohlen.
  • Standardisieren Sie die Servereinstellungen (my.cnf) und die Zeichensatzverbindungen.
  • Geben Sie utf8mb4 explizit auf Datenbank-, Tabellen- und Spaltenebene an.
  • Verwenden Sie VARCHAR(191), um Beschränkungen der Indexschlüssellänge zu vermeiden.
  • Verwenden Sie utf8mb4_unicode_ci für genaue Vergleiche.

8. FAQ

Hier sind häufige praxisnahe Fragen zum Ändern von MySQL-Zeichensätzen.
Wir behandeln außerdem wie man Fehler behandelt und wie man die besten Einstellungen wählt.

Was ist der Unterschied zwischen utf8 und utf8mb4?

SHOW VARIABLES LIKE 'character_set_server';

Führt das Ändern des MySQL-Zeichensatzes zu Datenverlust?

mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql

Wie behebe ich Mojibake, wenn es auftritt?

UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);

Welche Risiken gibt es beim Konvertieren von latin1 zu utf8mb4?

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Beeinflusst das Umstellen auf utf8mb4 die Leistung?

ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Welche sollte ich verwenden: utf8mb4_general_ci oder utf8mb4_unicode_ci?

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, accurate comparisonsGeneral-purpose use (recommended)

Werden Abfragen nach dem Umstellen auf utf8mb4 langsamer?

CREATE FULLTEXT INDEX idx_fulltext ON articles(content);

Zusammenfassung

utf8mb4 wird empfohlen. utf8 wird aufgrund seiner Einschränkungen nicht empfohlen.
Vor Änderungen immer die Einstellungen mit SHOW VARIABLES prüfen.
Verwenden Sie Export/Import‑Workflows, um Mojibake zu verhindern.
Berücksichtigen Sie Indexbeschränkungen und verwenden Sie VARCHAR(191) wo geeignet.
Für die Leistung passende Indizes hinzufügen.

Abschließende Hinweise

Das Ändern des MySQL-Zeichensatzes ist nicht nur eine einfache Konfigurationsanpassung – es ist eine kritische Aufgabe, die Datenintegrität und Leistung beeinflussen kann.
Durch das Befolgen der richtigen Einstellungen und Verfahren können Sie sicher und effektiv zu utf8mb4 migrieren.

🔹 Befolgen Sie die Schritte in diesem Artikel und konfigurieren Sie Ihren Zeichensatz korrekt! 🔹