Hi,网页设计师综合门户欢迎您!
设为首页  加为收藏  我要投稿找回密码免责声明意见反馈

招聘精英个人求职推广网站网友作品网页特效动画欣赏网页素材酷站欣赏源码下载设计软件

  • 全站搜索
  • 新闻资讯
  • 网页教程
  • 平面教程
  • 程序设计
  • 视频教程
  • Flash教程

网页设计师提供网页设计、网站程序开发、系统开发等,请联系QQ 103198680

 您当前的位置:首页 > 阅读文章
网页设计师综合门户欢迎您!

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

刊登方式:转载   来源:网络  作者:  关键词:平面设计理念  更新时间:2016/2/8

   什么是排序规则(collation)

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

SQL Server的排序规则(collation)冲突和解决方案  网页设计师综合门户

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