前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >𬎆 这个字你能看到算我输,看MogDB如何拿捏生僻字

𬎆 这个字你能看到算我输,看MogDB如何拿捏生僻字

作者头像
数据和云
发布2021-10-15 12:01:08
1.9K0
发布2021-10-15 12:01:08
举报
文章被收录于专栏:数据和云

最近在云和恩墨大讲堂的微信群里,有朋友讨论生僻字的存储,其实无论任何数据库,MogDB 还是 Oracle ,在任何数据库中存储生僻字,其实都和一个因素有关:字符集。

能否正常存储一个字符,首先是要看要存储的字符在数据库的当前字符集中是否能够表达。如果包含在数据库字符集中,则能够正常存储。

但是注意,很多时候,本应正常存储的字符,可能在写入过程中,因为环境问题转换错误,丢失了正确的字符,而出现乱码。

对于生僻字:㼆 yíng ,㱔 suǒ,䶮 yǎn,𬎆(王莹)(yíng)

这里面有一个特殊的字:𬎆(王莹)。注意,如果你的客户端没有支持的字库,则可能无法看到这个字。

注:正常情况下看到的应该是这样👆

我们看一下 MogDB 的表现,我们使用了墨天轮的实训平台,字符集如下:

代码语言:javascript
复制
enmotech=# select * from v$nls_parameters;
      parameter       |           value            |                                 description                                  
----------------------+----------------------------+------------------------------------------------------------------------------
 lc_collate           | en_US.UTF-8                | Shows the collation order locale.
 lc_ctype             | en_US.UTF-8                | Shows the character classification and case conversion locale.
 lc_messages          | en_US.UTF-8                | Sets the language in which messages are displayed.
 lc_monetary          | en_US.UTF-8                | Sets the locale for formatting monetary amounts.
 lc_numeric           | en_US.UTF-8                | Sets the locale for formatting numbers.
 lc_time              | en_US.UTF-8                | Sets the locale for formatting date and time values.
 nls_timestamp_format | DD-Mon-YYYY HH:MI:SS.FF AM | defines the default timestamp format to use with the TO_TIMESTAMP functions.
 NLS_CHARACTERSET     | UTF8                       | Database/Server encoding
(8 rows)

生僻字的示范:

如果直接贴代码,不支持的客户端可能就看不到其中的部分汉字:

代码语言:javascript
复制
enmotech=# create table mogdb (cname varchar2(10));
CREATE TABLE
enmotech=#
enmotech=# insert into mogdb values('䶮');
INSERT 0 1
enmotech=# insert into mogdb values('㼆');
INSERT 0 1
enmotech=# insert into mogdb values('𬎆');
INSERT 0 1
enmotech=# select cname,dump(cname) from mogdb;
 cname |       dump        -------+-------------------
 䶮   | Len=3 e4,b6,ae
 㼆   | Len=3 e3,bc,86
 𬎆  | Len=4 f0,ac,8e,86(3 rows)

enmotech=#

我们来进一步解释一下。在很多人的认知里,通常 ”㼆“更容易被正确存入数据库中,E3 BC 86 正是其在 UTF8 字符集下的正确编码。查看字符编码的网站:https://www.qqxiuzi.cn/bianma/zifuji.php(复制链接至浏览器中浏览)

而所谓的生僻字,其实是在 Unicode 统一编码标准中,在后期加入的,以支持更多的字符。

在Unicode中,汉字被划分为以下几个区,以Windows为例给出了支持版本:

  • 基本区:20902字。
  • 扩展A区:6582字。(Windows XP原生支持至此)
  • 扩展B区:42711字。(Windows Vista和Windows 7原生支持至此)
  • 扩展C区:4149字。
  • 扩展D区:222字。(Windows 8、Windows 8.1和Windows 10的早期版本支持至此)
  • 扩展E区:5762字。(Windows 10创意者更新中提供了部分支持)
  • 扩展F区:7473字。(不受支持)

㼆 字位于 A 区,而其简化形态 “王莹”则是位于 E区,大部分系统并不支持。

也就是说,这个字的编码:U+2C386(http://yedict.com/zscontent.asp?uni=2C386复制链接至浏览器中浏览) 已经给出,但是对于客户端,如果不支持这个显示,则无法正常展示出来。

所以对于一个字符的支持,是包括数据库和客户端两部分的。现在有些输入法可以打出这些生僻字,但是系统不一定能够支持,也就给使用带来了很多麻烦。

在一些字典上这个字是存在的:

对于上面所展示的“王莹”,已经分配了编码,其 UTF-8 编码是 F0AC8E86 ,只要我们将这个编码存入数据库(字符集如果是 AL32UTF8,可以直接存储),剩下的就是看客户端是否支持,如果支持,则查询后可以正常显示,如果不支持则将无法显示,出现一个替代符号或者乱码。

在一些字体网站(https://www.maoken.com/复制链接至浏览器中浏览)上,你可以找到支持了各种扩展字体的字库文件,安装之后,就能够展示这些生僻的汉字了。

例如,巴贝斯通汉

(https://www.maoken.com/freefonts/2803.html复制链接至浏览器中浏览)就支持了这些扩展区域的字符。

如果你在客户端安装了这个字体,那么如下一个网页,你将能够看到这个汉字“王莹”,我在这里包含了这个字“𬎆”,没有字体支持你就看不到:

理解清楚了字符集,也就能够找到了应对特殊字符的解决方案。

号外:欢迎预约 2021数据技术嘉年华大会,一起探索数据库的世界:

其实很多生僻字都是用在名字中的,没有受过名字的苦,不足以谈人生。我看到很多人在这个事情上遭受的磨难,为了名字能够正常出现,很多网友是穷尽了心力:

所以,我们的IT从业者,将数据库设计好、规划好,就是造福社会和人民了。大家加油!😄

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档