为什么没有显式COLLATE覆盖数据库排序规则?

时间:2010-11-18 04:44:17

标签: sql sql-server internationalization collation codepages

我在SQL Server 2008 R2 dev上,服务器默认排序规则是Cyrillic_General_CI_AS

在SSMS执行
    SELECT'éÉâÂàÀëËçæà'COLLATE Latin1_General_CS_AS

SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI   

输出

  • eEaAaAeEc?使用默认排序规则Cyrillic_General_CI_AS
  • 打开(使用/ use dbName的ocntext)数据库
  • éÉâÂàÀëËçæà在数据库中使用默认排序规则Latin1_General_CI_AS

为什么呢?

2 个答案:

答案 0 :(得分:6)

查询中的字符文字首先在数据库设置的任何排序规则下转换为varchar字符串,然后collation cast生效。

如果你想传递这样的字符文字并确保忠实地表示所有字符,最好将它们作为nvarchar文字传递:

create database CollTest collate Cyrillic_General_CI_AS
go
use CollTest
go
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS   
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI
go
SELECT N'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS   
SELECT N'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI
go

输出:

-----------
eEaAaAeEc?a

(1 row(s) affected)


-----------
eEaAaAeEc?a

(1 row(s) affected)


-----------
éÉâÂàÀëËçæà

(1 row(s) affected)


-----------
éÉâÂàÀëËçæà

(1 row(s) affected)

答案 1 :(得分:1)

根据this character table Cyrillic_General_CI_AS不包含æ字符。这可以解释为什么如果你真的使用默认值而不是你在select语句中使用的默认值,你会在其中看到?