mysql char 16进制_关于unicode:MySQL CHAR()函数和UTF8输出?

+--------------------------+--------------------------------------------------------+

| 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转义序列(包括补充字符)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值