+--------------------------+--------------------------------------------------------+
| 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。

谢谢

您的外壳使用什么字符集?

您正在将UTF-8与Unicode混淆。

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字符(如ü)仅占两个字节的原因。其他一些字符占用3或4个字节,但不那么常见。

谢谢您-非常有帮助。

非常感谢!!!! 最近两个小时,我一直在寻找" using"子句,不知道它叫什么! 谢谢!

嗨,Martin和@ Cyberdancer91:要澄清一下,UTF-8并不是要节省空间(这是一个非常常见的误解)。 它的目的是与ASCII兼容,这是系统支持Unicode而不破坏任何现有文本/配置文件的方式,这将需要大量的测试/修复时间。 前128个字符节省了1个字节,这只是一个副作用。 65k BMP字符中的63k占用1个EXTRA字节。 请在我的帖子sqlquantumleap.com/2018/09/28/中查看两个脚注(以及其他相关信息),并在下面给出我的答案。

添加到马丁的答案:

您可以使用"介绍人"代替CHAR()函数。为此,您可以在代码点之前指定带有下划线的编码:

_utf16 0xFC

要么:

_utf16 0x00FC

如果目标是指定代码点而不是编码的字节序列,那么您需要使用一种编码,其中代码点的值恰好是编码的字节序列。例如,如Martin的回答所示,0x00FC既是ü的代码点值,又是ucs2 / utf16的编码字节序列(它们对于BMP字符实际上是相同的编码,但是我更喜欢请使用" utf16",因为它与" utf"主题中的" utf8"和" utf32"保持一致)。

但是,就指定代码点值而言,utf16仅适用于BMP字符(代码点U + 0000-U + FFFF)。如果需要补充字符,则需要使用utf32编码。 _utf32 0xFC不仅返回ü,而且:

_utf32 0x1F47E

返回:👾

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

跨各种语言和平台的Unicode转义序列(包括补充字符)