Microsoft SQL Server排序规则名称

时间:2011-02-16 19:25:24

标签: sql-server collation

有人知道排序规则的WS属性是做什么的吗?它与亚洲类型的脚本有什么关系吗? MSDN文档将其解释为“宽度敏感”,但对瑞典语或英语说没有任何意义......?

2 个答案:

答案 0 :(得分:5)

此处总结了宽度灵敏度的良好描述:http://www.databasejournal.com/features/mssql/article.php/3302341/SQL-Server-and-Collation.htm

  

宽度灵敏度

     

当一个单字节字符   (半角)和相同的字符   当表示为双字节时   处理字符(全角)   不同的是宽度   敏感。

也许从英文角度来看,我认为宽度敏感的整理意味着'abc'<> N'abc',因为一个字符串是一个Unicode字符串(每个字符2个字节),而另一个字符是每个字符。

从拉丁字符集的角度来看,设置似乎没有意义。也许在其他语言中这很重要。

我尝试将这些类型的排序规则属性设置为不敏感,以避免像搜索结果中未返回的记录等奇怪的事情。我通常会将重音设置为不敏感,因为这会导致很多用户搜索问题,具体取决于应用程序的受众。

编辑: 在使用Latin1_General_CS_AS_WS整理创建测试数据库之后,我发现N'a'= N'A'实际上是真的。测试查询是:

select case when 'a' = 'A' then 'yes' else 'no' end
select case when 'a' = 'a' then 'yes' else 'no' end
select case when N'a' = 'a' then 'yes' else 'no' end 

所以在实践中我不确定这种规则在哪里发挥作用

答案 1 :(得分:1)

接受的答案表明它不会用于比较N'a' = 'a'。这很容易解释,因为char将在两者之间的比较中隐式转换为nchar,因此比较中的两个字符串都是Unicode。

我只是想到一个可以预期在拉丁文整理中发挥宽度敏感性的地方的一个例子,但发现它似乎没有任何区别......

DECLARE @T TABLE (
  a VARCHAR(2) COLLATE Latin1_General_100_CS_AS_WS,
  b VARCHAR(2) COLLATE Latin1_General_100_CS_AS_WS )

INSERT INTO @T
VALUES      (N'Æ',
             N'AE');

SELECT LEN(a) AS [LEN(a)],
       LEN(b) AS [LEN(b)],
       a,
       b,
       CASE
         WHEN a = b THEN 'Y'
         ELSE 'N'
       END    AS [a=b]
FROM   @T 

LEN(a)      LEN(b)      a    b    a=b
----------- ----------- ---- ---- ----
1           2           Æ    AE   Y

本书“Microsoft SQL Server 2008 Internals”就是这样说的。

  

宽度敏感度是指东亚   两种语言都存在   半宽和全宽的形式   一些人物。

只要列具有unicode数据类型,绝对没有什么能阻止您将这些字符存储在Latin1_General_100_CS_AS_WS这样的排序规则中,所以我猜WS部分仅适用于该特定情况