MySQL CHAR()函数和UTF8输出?

时间:2010-03-05 02:12:42

标签: mysql unicode utf-8

+--------------------------+--------------------------------------------------------+
| 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字符 - > “ü”而不是“?”尝试char(使用utf8的0x00FC),但没有去。

使用mysql版本5.1.41

全面了谷歌,在这上面找不到任何东西。 MySQL文档简单地说,在mysql 5.0.14之后,预期多值输出的值大于255。

由于

2 个答案:

答案 0 :(得分:7)

您将UTF-8与Unicode混淆。

0x00FC是ü:

Unicode 代码点
mysql> select char(0x00FC using ucs2);
+----------------------+
| char(0x00FC using ucs2) |
+----------------------+
| ü                   | 
+----------------------+

UTF-8 编码中,0x00FC is represented by two bytes

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

UTF-8只是一种以二进制形式编码 Unicode字符的方式。它意味着节省空间,这就是为什么ASCII字符只占用一个字节,而iso-8859-1字符如ü只占用两个字节。其他一些字符需要三到四个字节,但它们不常见。

答案 1 :(得分:0)

添加到Martin's answer

  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
    

    返回:?

有关这些选项的更多详细信息,以及其他语言和平台的Unicode转义序列,请参阅我的文章:

Unicode Escape Sequences Across Various Languages and Platforms (including Supplementary Characters)