当前位置:首页 > PHP教程 > PHP总结归纳

SQLServer的排序规则(collation)冲突和解决方案

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

  什么是排序规则(collation)

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

  这些排序规则有什么作用呢?让我们先来看看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)冲突。

  排序规则(collation)冲突。

  我们知道,sql server 从2000 开始,便支持多个排序规则。sql server 2000 的数据库可使用除默认排序规则以外的其他排序规则。此外,sql server 2000 还支持为列专门制定排序规则。

  这样一来,我们在写跨表、跨数据库、跨服务器操作的t-sql时,如果equal的字段排序规则不同,便会发生排序规则冲突。

  比如我们先见两个结构相同的表,但字段的排序规则不同:

  copy to clipboard

  -- 1. create tablea.

  create table tagstablea

  (

  tagname nvarchar(64) collate chinese_prc_bin

  )

  -- 2. create tableb.

  create table tagstableb

  (

  tagname nvarchar(64) collate chinese_prc_ci_as

  )

  当表建好之后执行:

  copy to clipboard

  -- 3. try to join them

  select * from tagstablea a inner join tagstableb b on a.tagname = b.tagname

  便会出下类似下面的问题:

  无法解决 equal to 操作中 "chinese_prc_bin" 和 "chinese_prc_ci_as" 之间的排序规则冲突。

.syntaxhighlighter{padding-top:20px;padding-bottom:20px;}
【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!