MySQL 4.1, PHP 5, SELECT CHAR mit UTF-8
am 07.10.2005 20:34:41 von Martin HonnenIch versuche gerade, die UTF-8 Faehigkeit von MySQL 4.1 in Verbindung
mit PHP 5 und mysqli zu verstehen. Dabei habe ich das Problem, dass
SELECT CHAR(228)
mir immer einen String mit einem Byte liefert, obwohl ich erwarte, dass
es in UTF-8 zwei Bytes liefern sollte.
Im einzelnen: PHP-Datei ist UTF-8 kodiert, Ausgabe soll UTF-8 sein,
Browser wird das per
header('Content-Type: text/html; charset=UTF-8');
mitgeteilt. Zuerst wird per
$query = 'SET NAMES \'utf8\'';
$result = $mySQL->query($query);
echo "
Result of $query: $result
\r\n";dem SQL-Server mitgeteilt, das UTF-8 benutzt werden soll, Resultat ist
1, also sollte das verstanden sein.
Folgende Anfrage
$query = 'SELECT \'ä\'';
$result = $mySQL->query($query);
$row = $result->fetch_row();
if ($row) {
echo "$query: '" . $row[0] . '\'; length: ' . strlen($row[0]) .
'; type: ' .gettype($row[0]) . '; ord(row[0]{0}): ' . ord($row[0]{0}) .
"\r\n";
$result->close();
}
ergibt dann auch
SELECT 'ä': 'ä'; length: 2; type: string; ord(row[0]{0}): 195
als Ausgabe im Browser, also zwei Bytes fuer das ä.
Aber die Anfrage
$query = 'SELECT CHAR(228)';
$result = $mySQL->query($query);
$row = $result->fetch_row();
if ($row) {
echo "$query: '" . $row[0] . '\'; length: ' . strlen($row[0]) .
'; type: ' .gettype($row[0]) . '; ord(row[0]{0}): ' . ord($row[0]{0}) .
"\r\n";
$result->close();
}
ergibt die Ausgabe
SELECT CHAR(228): '�'; length: 1; type: string; ord(row[0]{0}): 228
im Browser, also wird das Zeichen im String nicht UTF-8 kodiert.
Warum liefert CHAR(228) das Ergebnis nicht als UTF-8? Ist CHAR nicht
Unicode-faehig?
Welche Funktion koennte man statt CHAR in MySQL benutzen, um aus der
Unicode-Codenummer eines Zeichens das Zeichen zu generieren?
Getestet mit PHP 5.0.5 als CGI unter IIS/Windows XP, mysqli Client API
version 4.1.7, MySQL server 4.1.14-nt.
--
Martin Honnen
http://JavaScript.FAQTs.com/