MSSQL Server 排序规则详解

什么是排序规则(collation)

 

关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多

2010121145642

这些排序规则有什么作用呢?让我们先来看看MS官方的解释:

排序规则指定了表示每个字符的位模式。它还指定了用于排序和比较字符的规则。排序规则具有下面的特征:

  • 语言
  • 区分大小写
  • 区分重音
  • 区分假名

比如在SQL Server 2005中,排序规则名称由两部份构成,比如 Chinese_PRC_CI_AI_WS  
前半部份是指本排序规则所支持的字符集,如Chinese_PRC 指针对大陆简体字UNICODE的排序规则。   
后半部份即后缀的含义如下:

 

_BIN                指定使用向后兼容的二进制排序顺序。
_BIN2     指定使用 SQL Server 2005 中引入的码位比较语义的二进制排序顺序。
_Stroke  按笔划排序
_CI(CS)是否区分大小写,CI不区分,CS区分
_AI(AS)是否区分重音,AI不区分,AS区分
_KI(KS)是否区分假名类型,KI不区分,KS区分
_WI(WS)是否区分全半角,WI不区分,WS区分

 

既然排序规则如此复杂,那么应用了不同排序规则的列之间默认情况下便不能进行Union、Join、Like等equal操作了,于是便有了排序规则(collation)冲突。

 

 

常见的解决方案

知道了什么是排序规则冲突,我们接下来分析冲突的解决方案,以数据库级别的排序规则为例,一般来说,解决方案有下面几种

  1. 把SQL实例删了重建 ——大多数情况下等于没说-_-|||
  2. 修改数据库的排序规则 ——参考阿牛兄的这篇文章
  3. 在T-SQL中使用COLLATE DATABASE_DEFAULT来解决冲突 ——接下来主要讨论这个
COLLATE DATABASE_DEFAULT

 

Collate XXX 操作可以用在字段定义或使用时,它会将字段定义或转换成XXX 的排序规则格式。而Collate Database_Default 则会将字段定义或转换成当前数据库的默认排序规则,从而解决冲突。

比如在下面的代码中便使用了Collate Database_Default 来解决字段在equal操作中的排序规则冲突:

        Insert into Security.Report (Name)
              Select C.Path From SSRS.Catalog C 
        Where C.Path Collate Database_Default Like @ReportPath + '/%' 
              And C.Path Collate Database_Default Not In (Select Name From Security.Report R)
        

当然,在创建临时表时若对字段定义加上Collate Database_Default ,也可以方便地解决潜在的排序规则冲突,比如上一节中提到的存储过程,只要做如下修改即可。

            -- 1. Create Temp Table.
            CREATE TABLE #TagsTable
            (
                TagName        NVARCHAR(64)    COLLATE DATABASE_DEFAULT
            )   

结束语

对于专业的SQLer来说,排序规则的应用场景还有很多,例如利用排序规则特点计算汉字笔划和取得拼音首字母等等,更多信息,请查阅MSDN文档:http://msdn.microsoft.com/zh-cn/library/aa258237(en-us,SQL.80).aspx

谢谢!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值