Ein umfassender Leitfaden zur mysqli_set_charset-Funktion in PHP
Erfahren Sie, wie mysqli_set_charset den Zeichensatz einer MySQL-Verbindung in PHP korrekt setzt und warum dies auch eine Sicherheitsmaßnahme ist.
Wenn Sie Namen, Kommentare oder Emoji in MySQL speichern, werden die Bytes nur dann korrekt übertragen, wenn PHP und die Datenbank denselben Zeichensatz verwenden — also dieselbe Zuordnung zwischen Bytes und Zeichen. Die Funktion mysqli_set_charset legt den Zeichensatz für die Verbindung zwischen Ihrem PHP-Skript und dem MySQL-Server fest, sodass alles, was Sie senden und empfangen, auf beiden Seiten gleich interpretiert wird.
Diese Seite erklärt, was die Funktion tut, warum das Festlegen des Zeichensatzes für die Verbindung wichtig ist (und warum es auch eine Sicherheitsmaßnahme darstellt), sowie wie man sie sowohl mit der prozeduralen als auch mit der objektorientierten mysqli-API verwendet.
Was mysqli_set_charset tut
mysqli_set_charset teilt dem MySQL-Server mit, welchen Zeichensatz der Client (Ihr PHP-Skript) für den Rest der Verbindung verwenden wird. Es beeinflusst, wie Query-Strings interpretiert werden, wie Ergebnisse auf dem Rückweg kodiert werden und welche Bytes mysqli_real_escape_string() als speziell behandelt.
Die prozedurale Signatur nimmt zuerst die Verbindung und dann den Zeichensatznamen entgegen und gibt bei Erfolg true oder bei Misserfolg false zurück:
mysqli_set_charset(mysqli $connection, string $charset): boolDie objektorientierte Form ist eine Methode des Verbindungsobjekts:
$connection->set_charset($charset);Das Argument $charset ist ein MySQL-Zeichensatzname wie utf8mb4, utf8 oder latin1 — kein PHP-Kodierungsname. Verwenden Sie utf8mb4 für vollständige Unicode-Unterstützung, einschließlich 4-Byte-Zeichen wie Emoji; der ältere utf8-Alias in MySQL speichert nur bis zu 3 Bytes pro Zeichen und kann keine Emoji speichern.
Setzen Sie es auf der Verbindung, nicht nur in Abfragen. Das Ausführen von
SET NAMES utf8mb4als Abfrage ändert den serverseitigen Zeichensatz, aktualisiert jedoch nicht den Wert, den die C-Client-Bibliothek für das Escaping verwendet.mysqli_set_charsetaktualisiert beides, weshalb es der korrekte und sichere Weg ist, Zeichensätze zu wechseln.
Verbindung herstellen und Zeichensatz setzen
mysqli_set_charset benötigt eine bestehende Verbindung, öffnen Sie daher zuerst eine mit mysqli_connect. Das folgende Beispiel stellt eine Verbindung her und setzt anschließend sofort utf8mb4:
<?php
$host = 'localhost';
$user = 'username';
$password = 'password';
$database = 'mydatabase';
$connection = mysqli_connect($host, $user, $password, $database);
if (!$connection) {
die('Connection failed: ' . mysqli_connect_error());
}
if (!mysqli_set_charset($connection, 'utf8mb4')) {
die('Error setting charset: ' . mysqli_error($connection));
}
echo 'Current charset: ' . mysqli_character_set_name($connection);
// Current charset: utf8mb4Nachdem der Aufruf erfolgreich war, gibt mysqli_character_set_name den aktiven Zeichensatz zurück und bestätigt, dass die Änderung wirksam wurde.
Objektorientiertes Beispiel
Wenn Sie die objektorientierte mysqli-API verwenden, rufen Sie set_charset() als Methode auf. Es empfiehlt sich, dies direkt nach dem Erstellen der Verbindung zu tun, bevor eine Abfrage ausgeführt wird:
<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'mydatabase');
if ($mysqli->connect_errno) {
die('Connection failed: ' . $mysqli->connect_error);
}
if (!$mysqli->set_charset('utf8mb4')) {
die('Error setting charset: ' . $mysqli->error);
}
echo $mysqli->character_set_name();
// utf8mb4Fehlerbehandlung
mysqli_set_charset gibt false zurück, wenn der Server den angeforderten Zeichensatz nicht unterstützt (zum Beispiel bei einem Tippfehler wie utf8mb44). Überprüfen Sie immer den Rückgabewert, anstatt Erfolg vorauszusetzen:
<?php
if (!mysqli_set_charset($connection, 'utf8mb4')) {
// Log it and stop — running queries with the wrong charset
// can corrupt stored text and weaken escaping.
throw new RuntimeException(
'Failed to set charset: ' . mysqli_error($connection)
);
}Sie können die Funktion mehr als einmal auf derselben Verbindung aufrufen, um den Zeichensatz mid-Session zu wechseln, obwohl Sie ihn in der Praxis einmal direkt nach dem Verbindungsaufbau setzen und so belassen.
Warum es wichtig ist
- Korrekter Text. Ohne einen übereinstimmenden Zeichensatz werden Buchstaben mit Akzenten und nicht-lateinische Schriften als
?oder Mojibake (unleserliche Zeichen wieéstatté) zurückgegeben. - Emoji und vollständiges Unicode. Nur
utf8mb4speichert 4-Byte-Zeichen;utf8lässt sie ohne Warnung fallen oder schneidet sie ab. - Sicherheit.
mysqli_real_escape_string()führt das Escaping basierend auf dem Verbindungszeichensatz durch. Durch korrektes Setzen wird eine Klasse von SQL-Injection-Vektoren geschlossen, die Multibyte-Mismatches ausnutzen. Bevorzugen Sie dennoch vorbereitete Statements gegenüber manuellem Escaping.
Verwandte Funktionen
mysqli_connect— öffnet die Verbindung, die Sie anset_charsetübergeben.mysqli_get_charset— gibt ein vollständiges Objekt zurück, das den aktuellen Zeichensatz beschreibt (Kollation, Kommentar, Nummer).mysqli_character_set_name— gibt nur den Namen des aktiven Zeichensatzes zurück.mysqli_select_db— wechselt die aktive Datenbank auf einer bestehenden Verbindung.
Fazit
mysqli_set_charset stimmt den Zeichensatz Ihres PHP-Skripts mit Ihrer MySQL-Verbindung ab und stellt sicher, dass Text korrekt übertragen wird und Escaping sicher funktioniert. Setzen Sie ihn direkt nach dem Verbindungsaufbau auf utf8mb4, prüfen Sie den Rückgabewert, und Sie haben die häufigen Fälle abgedeckt — von Namen mit Akzenten bis hin zu Emoji.