视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
SQLServer的排序规则(collation)冲突和解决方案
2020-11-09 13:44:28 责编:小采
文档


什么是排序规则(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() COLLATE Chinese_PRC_BIN

  )

  -- 2. Create TableB.

  CREATE TABLE TagsTableB

  (

  TagName NVARCHAR() 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" 之间的排序规则冲突。

下载本文
显示全文
专题