暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[干货]重新认识字符集Part3

DigOps 2019-06-24
383

点击上方

蓝色

文字  关注我们吧!


做了几年的数据库管理员,依然在很多知识点上有盲区,其实也是一知半解,我也清楚不可能面面俱到。Oracle数据库是目前我用过最熟练的数据库,说熟练不说精通,不是谦虚,是从说话严禁角度来说的。Oracle内容太庞大了,官方文档就多达一个多GB,这么多内容,我是没办法精通的!


连着说了两天的字符集,关于Oracle字符集有必要去捋顺,这对后面的工作也有好处。



本文知识点

1. Oracle字符集

2. Oracle比较规则




1
 Oracle字符集

先来一个熟悉的界面


我们在通过DBCA图形化建立数据库时,都会看到这样一个界面--“字符集设置”,

这里面有两处是跟字符集有关的:

  1. database character set

  2. national character set


第一个是数据库字符集,其为数据库初始化参数NLS_CHARACTERSET,被用在char,varchar2,long,clob数据类型上。

*第二个是国际字符集,其为数据库初始化参数NLS_NCHAR_CHARACTERSET,被用在nchar,nvarchar2,nclob数据类型上。



Q:
*国际字符集是神马东东?
A:

我们在设置数据库字符集NLS_CHARACTERSET时,不一定会设置成为unicode字符集,比如设置成为GBK,那么,我们又需要用unicode怎么办,这时候,国际字符集NLS_NCHAR_CHARACTERSET就派上用场了。NLS_NCHAR_CHARACTERSET就能设置两个值:AL16UTF16和UTF8


Q:
Oracle中的AL32UTF8,UTF8神马关系?
A:

要声明一点,这里的UTF8是Oracle自己的,并非真正的UTF8。

回答这个问题,需要了解unicode版本,unicode从1.0到目前的12.1共经历24个版本。


Oracle在发展自己的字符集依然要遵守unicode(万国码),且每出一个版本的数据库,都要规划好其字符集,可以参考如下列表:


一目了然了吧,UTF8是依赖unicode 3.0标准,而AL32UTF8则一直还在随着数据库版本的发布,更新着所依赖的unicode版本。


那区别到底有多大呢?这么说吧,unicode 3.0共收录49259个字符,从unicode 3.1开始,共收录99089,这时候CJK(中日韩统一表意文字)被纳入,从unicode 4.1(包含)开始,GB18030-2005完全映射到unicode中。


所以总结下来,Oracle的UTF8在新版本数据库字符集中已经不建议使用了(太老),而是建议使用随着unicode不断更新的AL32UTF8。


Q:
如果更改Oracle字符集,子集改超集可以么?
A:

可以改,Oracle也提供了方法,但最后都会附一句话,不建议。改过的总是会觉得有些别扭。


我们经常用到的字符集有GBK(Oracle叫ZHS16GBK),GB18030(Oracle叫ZHS32GB18030),UTF8(Oracle叫AL32UTF8),按集合来说,AL32UTF8包含ZHS32GB18030,ZHS32GB18030包含ZHS16GBK。


Q:
GB18030哪去了?
A:

Oracle对GB18030支持的不是很友善。

我们知道GB18030,发布了两套标准编码,一套叫GB18030-2000,收录了27000多个字符,另一套叫GB18030-2005,收录了7万多个字符,已经非常全了,而Oracle中的对应的ZHS32GB18030字符集,是根据GB18030-2000来的。而在数据库字符集选项里面,也找不到ZHS32GB18030字符集。


Oracle从9.2开始已经将ZHS32GB18030作为客户端字符集,只能在客户端上使用。这就是强行让使用AL32UTF8呀,即使我们通过一些非常规手段去使用ZHS32GB18030,它也是GB18030-2000标准,这一点还是要清楚。




2
 字符比较规则


Oracle字符比较规则形式比较简单,可分为两种

  • Binary sort

  • linguistic sort


1)Binary sort

针对字符,转换为二进制编码进行比较,也就是通过ASCII标准。


2)linguistic sort


a. Monolingual linguistic sort,称为单语语言排序,Oracle自己定义的一套规则,将字母拆分两部分,分别叫major,minor。字母的变音和大小写有同样的major,不通的minor。 比较要经过两个步骤,第一先比较major,然后在比较minor。


b. Multilingual linguistic sort,称为多语语言排序,也是Oracle自己定义的一套规则,将比较分为3个级别,Primary Level Sorts(比较基本字母,不区分大小写),Secondary Level Sorts(比较是否有变音符号,变音在后),Tertiary Level Sorts(比较字母大小写,小写在大写前)。


Oracle影响排序的参数为NLS_SORT,默认为BINARY,可通过ALTER SESSION进行会话级别的修改。

中文排序,有三种方式:

1)拼音(默认)

2)STROKE(第一顺序“笔画数”,第二顺序“部首”)

3)RADICAL(第一顺序“部首”,第二顺序“笔画数”)


*Oracle 12.2版本及以后,比较规则可以定义在列级别上,并且支持不区分大小写和不区分重音,进步了

Oracle数据库字符集就总结这么多,对于日常使用已经够用了,以上内容,都是经过反复验证的内容,具有可靠性。虽然内容不多,也是牺牲了很多时间去查资料及实践去推敲。知识的由来,不应该只是拿来主义,更需要去实践、去验证。



更多推荐
[干货]重新认识字符集Part1
[干货]重新认识字符集Part2
文章转载自DigOps,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论