Функция MySQL CHAR () и вывод UTF8? - PullRequest
5 голосов
/ 05 марта 2010
+--------------------------+--------------------------------------------------------+
| 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)

Ожидается фактический символ utf8 -> «ü» вместо «?» Пробный символ (0x00FC, использующий utf8) также, но не идет.

Использование mysql версии 5.1.41

Был в Google, ничего не могу найти по этому вопросу. Документы MySQL просто говорят, что многобайтовый вывод ожидается при значениях, превышающих 255, после версии mysql 5.0.14.

Спасибо

Ответы [ 2 ]

7 голосов
/ 05 марта 2010

Вы путаете UTF-8 с Юникодом.

0x00FC - это кодировка Unicode для ü:

mysql> select char(0x00FC using ucs2);
+----------------------+
| char(0x00FC using ucs2) |
+----------------------+
| ü                   | 
+----------------------+

В кодировке UTF-8 , 0x00FC представлен двумя байтами :

mysql> select char(0xC3BC using utf8);
+-------------------------+
| char(0xC3BC using utf8) |
+-------------------------+
| ü                      | 
+-------------------------+

UTF-8 - это просто способ кодирования символов Unicode в двоичной форме. Он предназначен для экономии места, поэтому символы ASCII занимают только один байт, а символы iso-8859-1, такие как ü, занимают только два байта. Некоторые другие символы занимают три или четыре байта, но они встречаются гораздо реже.

0 голосов
/ 27 июня 2019

Добавление к Ответ Мартина :

  1. Вы можете использовать «интродьюсер» вместо функции CHAR(). Для этого необходимо указать кодировку с префиксом подчеркивания перед точкой кода:

    _utf16 0xFC
    

    или

    _utf16 0x00FC
    
  2. Если цель состоит в том, чтобы указать кодовую точку вместо кодированной последовательности байтов, то вам необходимо использовать кодировку, в которой значение кодовой точки просто оказывается кодированной последовательностью байтов. Например, как показано в ответе Мартина, 0x00FC является одновременно значением кодовой точки для ü и закодированной последовательностью байтов для ucs2 / utf16 (они фактически являются одинаковыми кодировками для символов BMP, но я предпочитаю используйте «utf16», так как это соответствует «utf8» и «utf32», в теме «utf»).

    Но utf16 работает только для символов BMP (кодовые точки U + 0000 - U + FFFF) с точки зрения указания значения кодовой точки. Если вам нужен дополнительный символ, вам нужно использовать кодировку utf32. Не только _utf32 0xFC возвращает ü, но и:

    _utf32 0x1F47E
    

    возвращает: & # x1F47E;

Более подробную информацию об этих параметрах, а также escape-последовательности Unicode для других языков и платформ см. В моем сообщении:

Unicode Escape-последовательности на разных языках и платформах (включая дополнительные символы)

...