MySQL CHAR() 函数和 UTF8 输出?
Posted
技术标签:
【中文标题】MySQL CHAR() 函数和 UTF8 输出?【英文标题】:MySQL CHAR() Function and UTF8 Output? 【发布时间】:2021-10-22 20:00:09 【问题描述】:+--------------+----------------- -------------------------------------------------+ |变量名 |价值 | +--------------------------+---------- ----------------------------------+ | 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】:添加到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)
【讨论】:
【参考方案2】:您将 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 & @Cyberdancer91:澄清一下,UTF-8 不是是为了节省空间(一个很常见的误解)。它旨在与 ASCII 兼容,这是一种系统支持 Unicode 而不会破坏任何现有文本/配置文件的方式,这需要大量的测试/修复时间。节省 1 个字节的前 128 个字符只是一个副作用; 65k BMP 字符中的 63k 占用 1 个额外字节。请参阅我的帖子中的两个脚注(和其他相关信息):sqlquantumleap.com/2018/09/28/…,以及下面的答案。以上是关于MySQL CHAR() 函数和 UTF8 输出?的主要内容,如果未能解决你的问题,请参考以下文章