注意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

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

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

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

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

_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'

如上测试截图所示,只有N、H或NH的组合会出现大小写敏感问题,其它字符没有这种情况,测试的时候,确实是颠覆我的三观,相当的惊讶和不解,然后我测试了不同排序规则,以及不同数据库版本,发现这个只在服务器排序规则为Latin1_General_CI_AS,数据库排序规则为Vietnamese_CI_AS,不管是SQL Server 2008、SQL Server 2012、 SQL Server 2014都会出现这个问题。网上搜索并没有很多资料,并没有什么答案,猜测跟Vietnamese的编码有关系,这个bug是同事在越南的项目遇到并发出来的。另外,在网上也发现有类似的求助 https://social.msdn.microsoft.com/forums/sqlserver/en-US/e634864a-13b5-49cd-a91d-0af38b5ce16c/tsql-like-1n 。遇到有这样场景的就需要格外小心了。解决方案,服务器排序规则和数据库排序规则一致肯定可以避免这个问题,另外临时解决方案就是在SQL语句中指定排序规则,如下所示:

注意Vietnamese_CI_AS排序规则下的特殊字符大小敏感问题的更多相关文章

  1. SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...

  2. Dynamics CRM 查找字段下拉的最多10个选项的排序规则

    原文链接来自DTCCh论坛http://dynamics.ms-talent.com.cn/bbs/content/?id=1406&catogory=CRM 如果你是从事dynamics c ...

  3. sql修改排序规则,区分大小

    alter   database   数据库   COLLATE   Chinese_PRC_CS_AS     修改排序规则,改成大小写敏感的排序规则     如果只修改一个表,用alter   t ...

  4. 关于Mysql数据库建库字符集utf8mb4下,排序规则utf8mb4_bin和utf8mb4_general_ci选择造成的查询匹配大小写问题

    场景描述: 项目采用了分库模式进行不同业务的开发,在共有的功能模块进行设计的时候采用主从库,或者各分库之中存在同样的库表结构,在使用过程中做库表同步的时候一定要保证库表所在的数据库的字符集和编码格式是 ...

  5. MySql字符集与排序规则详解

    前段时间往MySQL中存入emoji表情或生僻字.繁体字时,报错无法添加,研究后发现这是字符集编码的问题,今天就来分析一下各个字符集与排序规则 一.字符集 先说字符,字符是各种文字和符号的总称,包括各 ...

  6. Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)

    代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...

  7. "Chinese_PRC_CI_AS" 和 "Chinese_PRC_90_CI_AI" 之间的排序规则冲突问题

    这个错误真是太恶心了.不过有解决办法,你问我哪来的?当然百度的咯! 示例: select a.workTypeDes from A a,B b  where a.workTypeCode=b.work ...

  8. MS SQL 排序规则总结

    排序规则术语        什么是排序规则呢? 排序规则是根据特定语言和区域设置标准指定对字符串数据进行排序和比较的规则.SQL Server 支持在单个数据库中存储具有不同排序规则的对象.MSDN解 ...

  9. SQL SERVER修改排序规则——脚本篇

    在上篇MS SQL 排序规则总结中,大致就数据库服务器排序规则(或者叫数据库实例排序规则).数据库排序规则.列的排序规则粗浅的叙说了一遍,重点讲述了修改数据库服务器排序规则(数据库实例排序规则),其中 ...

随机推荐

  1. ng机器学习视频笔记(十六) ——从图像处理谈机器学习项目流程

    ng机器学习视频笔记(十六) --从图像处理谈机器学习项目流程 (转载请附上本文链接--linhxx) 一.概述 这里简单讨论图像处理的机器学习过程,主要讨论的是机器学习的项目流程.采用的业务示例是O ...

  2. Eclipse导入项目文件夹

    Eclipse项目导入出现感叹号解决方法 出现这样的情况怎么办 右击项目名-Bulid path -configure Bulid path 选择Libraries-Remove(移去错的)-Add ...

  3. .NET框架(转)

    三年前写的<.NET之美>的第六章,现在书名改为了<.NET专题解析>. 本书是一本讲解.NET技术的书籍,目标读者群也是在.NET框架(.NET Framework)下进行开 ...

  4. Java - 双冒泡法排序

    最开始的代码 我采用的是我原来进行快速排序所用的方法,一直做不出来. 为什么我会采用原来快速排序的方法?因为我的记忆中好像就是这样的,因此我根据记忆中的快速排序在进行改变,然而,却无法真正的写出双冒泡 ...

  5. python下用OpenCV的圆形检测

    写在文章前 这些天因为工作需要要学习图像检测,笨笨的我啥都不会要盯着OpenCV重头开始学(:′⌒`),甚至查资料能力都很弱弱〒▽〒 夸一下我最好的男票(*^▽^*)  男盆友也不是做图像处理的 但是 ...

  6. Django框架初识

    一.安装: pip3 install django 注意pip加入环境变量,安装好以后记得把Django加入环境变量     安装完成后,会在python目录下多了两个文件:1个django文件,1个 ...

  7. 安装RRDtool 1.4.5

    安装rrdtoolRrdtool安装需要cairo.libxml2.pango库支持,可通过yum安装安装libart_lgpl-devel这个包yum -y install libart_lgpl- ...

  8. BZOJ 3265: 志愿者招募加强版 [单纯形法]

    传送门 一个人多段区间,一样.... 不过国家队论文上说这道题好像不能保证整数解.... #include <iostream> #include <cstdio> #incl ...

  9. [Python Study Notes]Socket模拟ssh执行cmd并记录遇到的问题

    服务器端: 流程: 1.创建servert实例 2.绑定地址和端口 3.开始监听 4.创建客户端连接实例 5.等待客户端的消息 6.......... # The_author = 'liu66' # ...

  10. CSS3动画中的animation-timing-function效果演示

    CSS3动画(animation)属性有如下几个: 属性 值 说明 animation-name name 指定元素要使用的keyframes名称 animation-duration time(ms ...