Zeichensätze

Idealerweise sollte der richtige Zeichensatz auf Serverebene eingestellt werden. Dies wird im Abschnitt » Character Set Configuration des Handbuchs zum MySQL-Server beschrieben. Alternativ dazu bietet jede MySQL-API eine Methode, um den Zeichensatz zur Laufzeit zu setzen.

Achtung

Der Zeichensatz und die Maskierung von Zeichen

Da sich der Zeichensatz auf jede Aktion auswirkt und auch Auswirkungen auf die Sicherheit hat, sollte er bekannt und definiert sein. Zum Beispiel orientiert sich der Mechanismus für das Maskieren (z. B. mysqli_real_escape_string() bei mysqli und PDO::quote() bei PDO_MySQL) an dieser Einstellung. Es ist wichtig zu wissen, dass diese Funktionen nicht den Zeichensatz verwenden, der für eine Abfrage definiert ist, sodass z. B. Folgendes keinen Einfluss auf sie hat:

Beispiel #1 Probleme beim Einstellen des Zeichensatzes mit SQL

<?php

$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

// Wirkt sich NICHT auf $mysqli->real_escape_string(); aus
$mysqli->query("SET NAMES utf8mb4");

// Wirkt sich NICHT auf $mysqli->real_escape_string(); aus
$mysqli->query("SET CHARACTER SET utf8mb4");

// Allerdings wirkt sich das auf $mysqli->real_escape_string(); aus
$mysqli->set_charset('utf8mb4');

// Aber das wirkt sich NICHT aus (UTF-8 vs. utf8mb4) - hier keine Bindestriche verwenden
$mysqli->set_charset('UTF-8');
?>

Die folgenden Beispiele zeigen, wie der Zeichensatz mit der jeweiligen API korrekt zur Laufzeit geändert werden kann.

Hinweis: Möglicher Fehler mit UTF-8

Da die Namen von Zeichensätzen in MySQL keine Bindestriche enthalten, muss in MySQL die Zeichenkette "utf8" verwendet werden, um den Zeichensatz auf UTF-8 zu setzen (bis zu 3 Byte UTF-8 Unicode Encoding). Die Zeichenkette "UTF-8" ist dagegen ungültig, weshalb der Zeichensatz mit "UTF-8" nicht geändert werden kann und ein Fehler ausgegeben wird.

Beispiel #2 Beispiel für das Einstellen des Zeichensatzes: mysqli

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

echo
'Der ursprüngliche Zeichensatz: ' . $mysqli->character_set_name() . "\n";

if (!
$mysqli->set_charset('utf8mb4')) {
printf("Fehler beim Laden des Zeichensatzes utf8mb4: %s\n", $mysqli->error);
exit;
}

echo
'Der aktuelle Zeichensatz: ' . $mysqli->character_set_name() . "\n";
?>

Beispiel #3 Beispiel für das Einstellen des Zeichensatzes: pdo_mysql

<?php
$pdo
= new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>
To Top