SQL Server小心Vietnamese_CI_AS排序规则下的特殊字符大小敏感难题

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

 

近年,在SQL
Server中蒙受了Vietnamese_CI_AS排序规则的特殊字符的轻重缓急写敏感问题,是的,你没有看错,那句话并不曾语病(DBA老司机懂的)。遭逢那几个奇特境况的时候,小编也大跌眼镜,颠覆小编的局地常识,OK,闲话少说,我们来演示一下这么些越发情况下冒出的独特境况。

 

准备测试环境:

 

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

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

 

小心,唯有在这些一定排序规则下才会冒出那么些题材,准备好了测试环境后,我们先不难聊几句关于排序规则的学识,SQL
Server里面的排序规则其实是富含了字符集和排序规则不一事物,不像MySQL,字符集和排序规则概念和装置分开。尽管您想查看某些排序规则对应的字符集,那么就可用下边的SQL语句查看。如下截图所示:

   

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

 

 

SQL Server 1

 

 

 

 

 

 

 

 

 

 

 

Code Page

Language

 

932

Japanese

日语

936

Simplified Chinese

简体中文

949

Korean

韩文

950

Traditional Chinese

繁体中文

1258

Vietnamese

越南语

 

从上可以见见Chinese_PRC_CI_AS的编码为936,即使对编码相比较了解的就很明亮,可是可能也有一对对这一个不太驾驭。上边不难述说一下,

 

 

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

 

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

 

UTF-8:Unicode
TransformationFormat-8bit,允许含BOM,但一般不含BOM。是用来缓解国际上字符的一种多字节编码,它对英文使用7位(即一个字节),普通话使用二十五位(七个字节)来编码。UTF-8包罗全球享有国家急需采用的字符,是国际编码,通用性强。UTF-8版本即便拥有优秀的国际包容性,但汉语要求比GBK/BIG5版本多占用二分之一的数据库存储空间。

 

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

_BIN           
指定使用向后卓殊的二进制排序依次。

_BIN2     
  
指定使用 SQL Server 二零零五 中引入的码位相比语义的二进制排序依次。

_Stroke    

按笔划排序

_CI(CS)    

是不是区分轻重缓急写,CI不区分,CS区分(case-insensitive/case-sensitive)

_AI(AS)    

是否区分重音,AI不区分,AS区分(accent-insensitive/accent-sensitive)

_KI(KS)    

是还是不是区分假名类型,KI不区分,KS区分(kanatype-insensitive/kanatype-sensitive)

_WI(WS)    

是不是区分全半角,
WI不区分,WS区分(width-insensitive/width-sensitive)

 

好了,简单概述了有的有关编码和字符集的文化。那么大家来探望Vietnamese_CI_AS的Code
Page为1258,那些是立陶宛语言的一个字符集,很多个人唯恐没有用过这一个,不过并未提到。那么大家先来探视难点。准备测试环境和数量,如下所示

 

 

 

USE  TEST;

GO

 

CREATE
TABLE TEST (name NVARCHAR(12));

 

INSERT
INTO TEST

SELECT
N’lienht’ UNION ALL

SELECT
N’LienHT’ UNION ALL

SELECT
N’LienHt’

 

 

SELECT
* FROM TEST WHERE name =’lienHt’;

SELECT
* FROM TEST WHERE name =’lienht’

SELECT
* FROM TEST WHERE name =’LIenht’

SELECT
* FROM TEST WHERE name =’LIeNht’

 

 

 

SQL Server 2

 

SQL Server 3

 

 

如上测试截图所示,只有N、H或NH的组合会出现大小写敏感难点,别的字符没有那种气象,测试的时候,确实是颠覆作者的三观,相当的奇异和不解,然后自身测试了差距排序规则,以及不相同数据库版本,发现这些只在服务器排序规则为Latin1_General_CI_AS,数据库排序规则为Vietnamese_CI_AS,不管是SQL
Server 二零零六、SQL Server 2013、 SQL Server
二〇一六都会油不过生这么些难题。网上检索并没有过多资料,并没有啥答案,揣摸跟Vietnamese的编码有关联,这些bug是同事在越南社会主义共和国的档次蒙受并发出来的。其它,在网上也发现有像样的求救
https://social.msdn.microsoft.com/forums/sqlserver/en-US/e634864a-13b5-49cd-a91d-0af38b5ce16c/tsql-like-1n
。碰到有那般意况的就要求丰硕小心了。消除方案,服务器排序规则和数据库排序规则一样肯定可防止止那些题材,其余权且消除方案就是在SQL语句中指定排序规则,如下所示:

 

 

 

SQL Server 4

相关文章