MySQL CHAR() 函数和 UTF8 输出?

Posted

技术标签:

【中文标题】MySQL CHAR() 函数和 UTF8 输出?【英文标题】:MySQL CHAR() Function and UTF8 Output? 【发布时间】:2011-01-23 22:57:46 【问题描述】:
+--------------+----------------- -------------------------------------------------+
|变量名 |价值 |
+--------------------------+---------- ----------------------------------+
| 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 的值需要多字节输出。

谢谢

【问题讨论】:

你的 shell 使用的是什么字符集? 【参考方案1】:

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

【讨论】:

非常感谢!!!!过去两个小时我一直在寻找“使用”子句,不知道它叫什么!谢谢! 嗨 Martin & @Cyber​​dancer91:澄清一下,UTF-8 不是是为了节省空间(一个很常见的误解)。它旨在与 ASCII 兼容,这是一种系统支持 Unicode 而不会破坏任何现有文本/配置文件的方式,这需要大量的测试/修复时间。节省 1 个字节的前 128 个字符只是一个副作用; 65k BMP 字符中的 63k 占用 1 个额外字节。请参阅我的帖子中的两个脚注(和其他相关信息):sqlquantumleap.com/2018/09/28/…,以及下面的答案。【参考方案2】:

添加到Martin's answer:

    您可以使用“介绍人”代替CHAR() 函数。为此,您需要在代码点之前指定编码,以下划线前缀

    _utf16 0xFC
    

    或:

    _utf16 0x00FC
    

    如果目标是指定代码点而不是编码字节序列,那么您需要使用代码点值恰好是编码字节序列的编码。例如,如 Martin 的回答所示,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)

【讨论】:

以上是关于MySQL CHAR() 函数和 UTF8 输出?的主要内容,如果未能解决你的问题,请参考以下文章

php json_encode utf8 char问题(mysql)[重复]

MySQL中varchar与char区别

Mysql常用数据类型

在cmd里运行mysql,显示中文乱码

MySQL2

彻底解决mysql中文乱码