character_set_name
Erfahren Sie mehr über die Funktion mysqli_character_set_name() in PHP zum Abrufen des Zeichensatznamens einer MySQL-Verbindung.
Die Funktion mysqli_character_set_name() gibt den Standard-Zeichensatz zurück, der für die aktuelle MySQLi-Verbindung verwendet wird — zum Beispiel utf8mb4, utf8 oder latin1. Diese Seite erklärt, was die Funktion zurückgibt, ihre Syntax in beiden Stilen, wann man sie einsetzt und welche Kodierungsprobleme sie aufdecken hilft.
Was der Zeichensatz steuert
Der Verbindungszeichensatz teilt MySQL mit, wie die gesendeten Bytes interpretiert werden sollen (in INSERT/UPDATE-Anweisungen und Abfrageparametern) und wie die zurückgesendeten Bytes kodiert werden. Stimmt der Verbindungszeichensatz nicht mit der tatsächlichen Kodierung der Zeichenketten überein, entsteht Mojibake — korrumpierte Akzentbuchstaben, Emojis werden zu ????, und stille Datenverluste.
mysqli_character_set_name() ist der schnellste Weg, diese Einstellung zur Laufzeit zu prüfen. Es handelt sich um eine schreibgeschützte Diagnose: Sie ändert nichts. Um den Zeichensatz zu ändern, verwendet man set_charset().
Syntax
Die Funktion hat eine objektorientierte und eine prozedurale Form. Beide sind gleichwertig — wählen Sie diejenige, die zu Ihrem Code passt.
// Object-oriented style
string $mysqli->character_set_name()
// Procedural style
string mysqli_character_set_name(mysqli $mysqli)- Parameter (nur prozedural):
$mysqli— eine Verbindung, die vonmysqli_connect()odernew mysqli()zurückgegeben wird. - Rückgabewert: ein string, der den aktuellen Zeichensatznamen enthält (z. B.
"utf8mb4"). Es wird nichtfalsezurückgegeben; bei einer gültigen Verbindung gibt es immer einen Zeichensatz.
So verwenden Sie mysqli_character_set_name()
Rufen Sie die Funktion auf einer offenen Verbindung auf und geben Sie das Ergebnis aus:
<?php
$mysqli = new mysqli("localhost", "your_username", "your_password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
echo "Character set: " . $mysqli->character_set_name();
$mysqli->close();
?>Eine typische Ausgabe, bevor Sie etwas explizit festgelegt haben, ist der Standard des Servers:
Character set: utf8mb4Dasselbe im prozeduralen Stil:
<?php
$mysqli = mysqli_connect("localhost", "your_username", "your_password", "database");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
}
echo "Character set: " . mysqli_character_set_name($mysqli);
mysqli_close($mysqli);
?>Zeichensatz nach einer Änderung auslesen
Da die Funktion die aktuelle Einstellung meldet, eignet sie sich gut, um zu bestätigen, dass ein Aufruf von set_charset() tatsächlich wirksam war:
<?php
$mysqli = new mysqli("localhost", "your_username", "your_password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
echo "Before: " . $mysqli->character_set_name() . "\n";
$mysqli->set_charset("utf8mb4");
echo "After: " . $mysqli->character_set_name() . "\n";
$mysqli->close();
?>Before: latin1
After: utf8mb4Warum Sie den Zeichensatz setzen und nicht nur auslesen sollten
mysqli_character_set_name() meldet nur den Zeichensatz — er kann ihn nicht korrigieren. Für vollständige Unicode-Unterstützung (einschließlich Emojis und vieler CJK-Zeichen) setzen Sie utf8mb4 direkt nach dem Verbindungsaufbau:
<?php
$mysqli = new mysqli("localhost", "your_username", "your_password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
$mysqli->set_charset("utf8mb4");
$mysqli->query("INSERT INTO users (name, email) VALUES ('Jörg 🚀', '[email protected]')");
$mysqli->close();
?>Hinweise und Fallstricke:
- Bevorzugen Sie
utf8mb4gegenüberutf8. MySQL's veraltetesutf8ist ein 3-Byte-Alias, der 4-Byte-Zeichen wie Emojis nicht speichern kann.utf8mb4ist das echte, vollständige UTF-8. - Ändern Sie den Zeichensatz nicht mit
SET NAMES ...als Abfrage. Das aktualisiert zwar die serverseitige Sitzung, lässt die Client-Bibliothek aber unwissend, wasreal_escape_string()beschädigt. Verwenden Sie immerset_charset(), damit beide synchron bleiben. - Der zurückgegebene Name ist der Zeichensatz der Verbindung, der unabhängig vom im Schema definierten Zeichensatz einer Spalte oder Tabelle ist.
Verwandte Funktionen
mysqli_set_charset()— den Verbindungszeichensatz ändern.mysqli_get_charset()— ein vollständiges object mit Zeichensatzbeschreibung abrufen (Kollation, Bytelänge und mehr).mysqli_connect_errno()/mysqli_connect_error()— Verbindungsfehler erkennen, bevor der Zeichensatz ausgelesen wird.- PHP MySQLi-Übersicht — die umfassendere MySQLi-Erweiterung.
Fazit
mysqli_character_set_name() ist eine kleine, zuverlässige Diagnosefunktion, um zu prüfen, welchen Zeichensatz eine MySQL-Verbindung verwendet. Lesen Sie ihn aus, um Kodierungsprobleme zu debuggen, und beheben Sie sie dann mit set_charset("utf8mb4"), damit Ihre Anwendung Akzentzeichen und Emojis korrekt speichert.