6
+--------------------------+---------- ----------------------------------+
| 变量名 | 价值 |
+--------------------------+---------- ----------------------------------+
| character_set_client | utf8 |
| 字符集连接 | utf8 |
| 字符集数据库 | utf8 |
| 字符集文件系统 | 二进制 |
| 字符集结果 | utf8 |
| character_set_server | utf8 |
| 字符集系统 | utf8 |
| 字符集目录 | /usr/local/mysql-5.1.41-osx10.5-x86_64/share/charsets/ |
+--------------------------+---------- ----------------------------------+
8 行一组(0.00 秒)

mysql>选择版本();
+-----------+
| 版本() |
+-----------+
| 5.1.41 |
+-----------+
一组中的 1 行(0.00 秒)

mysql> 选择字符(0x00FC);
+---------------+
| 字符(0x00FC) |
+---------------+
| ? |
+---------------+
一组中的 1 行(0.00 秒)

期待实际的 utf8 字符 --> "ü" 而不是 "?" 也尝试了 char(0x00FC using utf8),但没有成功。

使用 mysql 版本 5.1.41

遍地谷歌,找不到任何关于此的东西。MySQL 文档只是说,在 mysql 版本 5.0.14 之后,大于 255 的值需要多字节输出。

谢谢

4

2 回答 2

8

您将 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 字符(例如 ü)只占用两个字节的原因。其他一些字符占用三个或四个字节,但它们不太常见。

于 2010-03-05T03:29:01.467 回答
1

添加到马丁的答案

  1. 您可以使用“介绍人”而不是CHAR()功能。为此,您在代码点之前指定编码,前缀为下划线

    _utf16 0xFC
    

    或者:

    _utf16 0x00FC
    
  2. 如果目标是指定代码点而不是编码字节序列,那么您需要使用编码点值恰好是编码字节序列的编码。例如,如 Martin 的回答所示,是/0x00FC的代码点值ü和编码字节序列(它们实际上是 BMP 字符的相同编码,但我更喜欢使用“utf16”,因为它与“utf8”一致和“utf32”,与“utf”主题一致)。ucs2utf16

    但是,utf16就指定代码点值而言,仅适用于 BMP 字符(代码点 U+0000 - U+FFFF)。如果你想要一个补充字符,那么你将需要使用utf32编码。不仅_utf32 0xFCreturn ü,而且:

    _utf32 0x1F47E
    

    返回:

于 2019-06-27T06:19:16.343 回答