MySQL CHAR () Funktion und UTF8 Output?
-
24-09-2019 - |
Frage
+--------------------------+--------------------------------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql-5.1.41-osx10.5-x86_64/share/charsets/ | +--------------------------+--------------------------------------------------------+ 8 rows in set (0.00 sec) mysql> select version(); +-----------+ | version() | +-----------+ | 5.1.41 | +-----------+ 1 row in set (0.00 sec) mysql> select char(0x00FC); +--------------+ | char(0x00FC) | +--------------+ | ? | +--------------+ 1 row in set (0.00 sec)
Expecting tatsächliche UTF-8 Zeichen -> "ü" statt Versuchte char (0x00FC mit UTF-8) auch, aber no go "?".
MySQL-Version 5.1.41
allover die Google Been, kann nichts dazu finden. Die MySQL-docs sagen einfach, dass multibyte Ausgang auf Werte größer als 255, nach MySQL Version 5.0.14 erwartet wird.
Danke
Lösung
Sie sind verwirrend UTF-8 mit Unicode.
0x00FC ist der Unicode Codepunkt für ü:
mysql> select char(0x00FC using ucs2);
+----------------------+
| char(0x00FC using ucs2) |
+----------------------+
| ü |
+----------------------+
UTF-8 Codierung 0x00FC wird durch zwei Bytes dargestellt
mysql> select char(0xC3BC using utf8);
+-------------------------+
| char(0xC3BC using utf8) |
+-------------------------+
| ü |
+-------------------------+
UTF-8 ist lediglich eine Art und Weise von Codierung Unicode-Zeichen in Binärform. Es soll Raum effizient sein, weshalb nur ASCII-Zeichen ein einzelnes Byte nehmen, und iso-8859-1 Zeichen wie ü nur zwei Bytes nehmen. Einige andere Zeichen nehmen drei oder vier Bytes, aber sie sind viel weniger verbreitet.
Andere Tipps
Zusätzlich zu Martin Antwort :
-
Sie können eine „Einführungs“ anstelle der
CHAR()
-Funktion verwenden. Dazu geben Sie die Codierung, Präfix mit einem Unterstrich , bevor der Codepunkt:_utf16 0xFC
oder:
_utf16 0x00FC
-
Wenn das Ziel, den Codepunkt anstelle dem kodierten Bytefolge zu spezifizieren ist, dann müssen Sie eine Codierung verwenden, bei dem der Codepunktwert gerade geschieht, die codierte Byte-Sequenz zu sein. Zum Beispiel, wie in Martin Antwort gezeigt, ist
0x00FC
sowohl der Codepunktwert fürü
und die codierte Byte-Sequenz fürucs2
/utf16
(sie effektiv die gleiche Codierung für BMP Zeichen sind, aber ich ziehe „utf16“ zu verwenden, da es im Einklang mit "uTF-8" und "UTF32", konsequent in dem "utf" Thema).Aber
utf16
funktioniert nur für BMP-Zeichen (Codepunkte U + 0000 - U + FFFF) in Bezug auf den Codepunktwert angibt. Wenn Sie einen Ergänzungs Charakter wollen, dann müssen Sie dieutf32
Codierung verwenden. Nicht nur, dass_utf32 0xFC
Rückkehrü
, aber:_utf32 0x1F47E
Rückgabe: