MySQL 4.1, PHP 5, SELECT CHAR mit UTF-8

MySQL 4.1, PHP 5, SELECT CHAR mit UTF-8

am 07.10.2005 20:34:41 von Martin Honnen

Ich 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/

Re: MySQL 4.1, PHP 5, SELECT CHAR mit UTF-8

am 08.10.2005 15:56:16 von Martin Honnen

Martin Honnen wrote:

> 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?

Die Online-Doku deutet mit

" As of MySQL 5.0.14, the CHAR() function now takes into account the
character set and collation given by the character_set_connection and
collation_connection system variables. For an argument n to CHAR(), the
result is n mod 256 for single-byte character sets. For multi-byte
character sets, n must be a valid code point in the character set."

an, dass das, was ich will (CHAR(UnicodeCodeNummer) => Unicodezeichen),
erst in 5.0.14 und damit wohl nicht in 4.1 funktioniert.

Das stand leider nicht in der Offline-Doku, die ich habe.

--

Martin Honnen
http://JavaScript.FAQTs.com/