Signatur
Beschreibung
mysqli_set_charset() setzt den Zeichensatz (Charset) der aktuellen Datenbankverbindung. Die Funktion teilt dem MySQL-Server mit, welche Zeichenkodierung der Client bei der Übertragung von Strings verwendet, und sorgt so dafür, dass Daten korrekt kodiert übertragen und gespeichert werden.
Die empfohlene Methode, den Zeichensatz einer mysqli-Verbindung zu setzen, ist genau diese Funktion – nicht die Ausführung von SET NAMES ... über mysqli_query(). SET NAMES informiert die interne Escape-Funktion (mysqli_real_escape_string()) nicht über den neuen Zeichensatz, was zu Sicherheitslücken führen kann.
Üblicherweise wird mysqli_set_charset() direkt nach dem Verbindungsaufbau aufgerufen, um sicherzustellen, dass sämtliche nachfolgenden Abfragen und Ergebnisse einheitlich kodiert sind. Für moderne Anwendungen empfiehlt sich der Einsatz von utf8mb4, das den vollständigen Unicode-Zeichenvorrat inklusive Emoji unterstützt.
Die verfügbaren Zeichensatznamen können über SHOW CHARACTER SET auf dem MySQL-Server abgerufen werden. Ungültige oder vom Server nicht unterstützte Zeichensatznamen führen dazu, dass die Funktion false zurückgibt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Ein mysqli-Verbindungsobjekt, das durch mysqli_connect() oder mysqli_init() erzeugt wurde. |
|
| $charset Pflicht | string | Der Name des gewünschten Zeichensatzes, z. B. 'utf8mb4' oder 'latin1'. Der Wert muss ein vom Server unterstützter Zeichensatzname sein. |
Rückgabewert
true zurück, wenn der Zeichensatz erfolgreich gesetzt wurde. Gibt false zurück, wenn der angegebene Zeichensatz ungültig ist oder vom Server nicht unterstützt wird.Beispiele
Zeichensatz nach dem Verbindungsaufbau setzen
<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'meine_datenbank');
if (!$mysqli) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
// Zeichensatz direkt nach dem Verbindungsaufbau setzen
if (!mysqli_set_charset($mysqli, 'utf8mb4')) {
die('Fehler beim Setzen des Zeichensatzes: ' . mysqli_error($mysqli));
}
echo 'Zeichensatz erfolgreich gesetzt: ' . mysqli_character_set_name($mysqli);
mysqli_close($mysqli);
Objektorientierter Stil mit utf8mb4 und sicherem Escaping
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'meine_datenbank');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// utf8mb4 unterstützt den vollständigen Unicode-Zeichenvorrat inkl. Emoji
$mysqli->set_charset('utf8mb4');
// Nach dem Setzen des Zeichensatzes ist mysqli_real_escape_string korrekt abgesichert
$benutzereingabe = "O'Brien 😀";
$sicher = $mysqli->real_escape_string($benutzereingabe);
$sql = "INSERT INTO personen (name) VALUES ('$sicher')";
$mysqli->query($sql);
echo 'Eintrag gespeichert.';
$mysqli->close();
// Wichtig · Fallstricke
Sicherheitshinweis: Verwende niemals SET NAMES utf8mb4 via mysqli_query() als Ersatz für mysqli_set_charset(). SET NAMES aktualisiert den internen Zustand der Verbindung nicht vollständig – mysqli_real_escape_string() wäre dann nicht über den neuen Zeichensatz informiert, was bei Multi-Byte-Zeichensätzen theoretisch SQL-Injection ermöglichen kann.
utf8 vs. utf8mb4: MySQL's interner utf8-Zeichensatz unterstützt nur 3-Byte-Unicode-Zeichen (BMP) und kann keine Emoji oder seltene Zeichen kodieren. Für volle Unicode-Unterstützung sollte stets utf8mb4 verwendet werden.
Wenn mysqli_set_charset() nach dem Verbindungsaufbau fehlschlägt, liefert mysqli_error() eine aussagekräftige Fehlermeldung. Mögliche Ursachen sind ein nicht installiertes Charset auf dem MySQL-Server oder ein Tippfehler im Zeichensatznamen.