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

War es hilfreich?

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 :

  1. 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
    
  2. 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ür ucs2 / 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 die utf32 Codierung verwenden. Nicht nur, dass _utf32 0xFC Rückkehr ü, aber:

    _utf32 0x1F47E
    

    Rückgabe:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top