澳门金沙vip 1

【澳门金沙vip】SQLserver排序规则基本概念探索_MsSql_脚本之家

注意Vietnamese_CI_AS排序规则下的特殊字符大小敏感问题

前言

 

昨天在论坛里面遇到一个比较特殊的场景。他的公司做的是海外的项目,中英再加一个当地语言,要兼容三种文字啊.那有没有什么字符集或排序规则,能兼容所有文字的?对于海外项目很痛苦啊
.Oracle 有AL32UTF8 ,MySQL 有UTF8 ,那SQL Server 有吗?

最近,在SQL
Server中遇到了Vietnamese_CI_AS排序规则的特殊字符的大小写敏感问题,是的,你没有看错,这句话并没有语病(DBA老司机懂的)。遇到这个特殊情况的时候,我也大跌眼镜,颠覆我的一些常识,OK,闲话少说,我们来演示一下这个特殊场景下出现的特殊情况。

基本概念

 

ASCII编码

准备测试环境:

在计算机发明后不久,计算机只在美国用。他们创造出了ASCII编码,来表示:空格、标点符号、数字、大小写字母,控制符等。可以完整的表达所有的英文。但是也只支持英文。

 

GBK编码

   
服务器排序规则(Server
Collation)         :  Latin1_General_CI_AS

后来随着计算机的流行,中国人民通过对 ASCII 编码的中文扩充改造,产生了
GB2312
编码,可以表示6000多个常用汉字。汉字实在是太多了,包括繁体和各种字符,于是产生了

   
数据库排序规则(Database
Collation)     
:  
Vietnamese_CI_AS

GBK 编码,它包括了 GB2312
中的编码,同时扩充了很多。中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把
GBK 编码扩充为 GB18030 编码。

 

每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。

注意,只有在这个特定排序规则下才会出现这个问题,准备好了测试环境后,我们先简单聊几句关于排序规则的知识,SQL
Server里面的排序规则其实是包含了字符集和排序规则两样东西,不像MySQL,字符集和排序规则概念和设置分开。如果你想查看某个排序规则对应的字符集,那么就可用下面的SQL语句查看。如下截图所示:

终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE
,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有
UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成
UNICODE 编码就可以被其他电脑正常解释。

   

UTF-8 AND UTF-16

SELECT  COLLATIONPROPERTY('Vietnamese_CI_AS', 'CodePage')                AS CodePage ,

        COLLATIONPROPERTY('Vietnamese_CI_AS', 'ComparisonStyle')        AS ComparisonStyle ,

        COLLATIONPROPERTY('Chinese_PRC_CI_AS', 'CodePage')                AS CodePage ,

        COLLATIONPROPERTY('Chinese_PRC_CI_AS', 'ComparisonStyle')        AS ComparisonStyle ,

        COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'CodePage')    AS CodePage ,

        COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'ComparisonStyle') AS ComparisonStyle

UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输
8个位。于是就会有人产生疑问,UTF-8
既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK
等编码的人?因为 UTF-8
等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用GBK
等编码也可以。

 

总的来说:

 

Unicode 是「字符集」

澳门金沙vip 1

UTF-8 是「编码规则」

 

字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code
Point)编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为
加密/解密 的过程)

 

排序规则

 

比如我们常用的:Chinese_PRC_CI_AS ,前面部分是Chinese_PRC
这个部分表示支持的中国大陆的字符集。但是这里有个特别需要注意的事项,划重点,在很多博客上面会有这样的描述:

 

大陆简体字UNICODE的排序规则

 

这里有很大的歧义。并不是说这个排序规则对所有字符都是有的Unicode。这样说并不准确。

 

澳门金沙vip,排序规则的后半部份即后缀 含义:

 

_BIN 二进制排序 _CI
是否区分大小写,CI不区分,CS区分(case-insensitive/case-sensitive) _AI
是否区分重音,AI不区分,AS区分(accent-insensitive/accent-sensitive) _KI
是否区分假名类型,KI不区分,KS区分(kanatype-insensitive/kanatype-sensitive)
_WI 是否区分宽度 WI不区分,WS区分(width-insensitive/width-sensitive)

 

区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。

 

区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,

 

比较还将重音不同的字母视为不等。

 

区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。

Code Page

Language

 

932

Japanese

日语

936

Simplified Chinese

简体中文

949

Korean

韩文

950

Traditional Chinese

繁体中文

1258

Vietnamese

越南语

区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项

 

Unicode

从上可以看到Chinese_PRC_CI_AS的编码为936,如果对编码比较熟悉的就很清楚,但是可能也有一些对这个不太了解。下面简单述说一下,

SQL SERVER 是支持Unicode的。对应的字符类型是nchar,nvarchar.

 

总结

 

所以,SQL SERVER 没有这样的和ORACLE
UTF-8类似的排序规则。。如果是三种文字,建议把所有的字符类型定义为nchar,nvarchar

 所谓代码页(code
page)就是针对一种语言文字的字符编码。例如GBK的code page是CP936
,BIG5的code page是CP950,GB2312的code page是CP20936。

以上就是本文关于SQLserver排序规则基本概念探索的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:浅谈sqlserver下float的不确定性、SQLserver中cube:多维数据集实例详解、sqlserver:查询锁住sql以及解锁方法等,有什么问题可以随时留言,小编会及时回复大家,在此也希望朋友们对本站多多支持!

 

 GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

 

UTF-8:Unicode
TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8版本虽然具有良好的国际兼容性,但中文需要比GBK/BIG5版本多占用50%的数据库存储空间。

 

排序规则的后半部份即后缀
含义:

_BIN           
指定使用向后兼容的二进制排序顺序。

_BIN2     
  
指定使用 SQL Server 2005 中引入的码位比较语义的二进制排序顺序。

_Stroke    

按笔划排序