【问题标题】:Why doesn't explicit COLLATE override database collation?为什么不显式 COLLATE 覆盖数据库排序规则?
【发布时间】:2011-05-11 20:05:33
【问题描述】:
我在 SQL Server 2008 R2 dev 上,服务器默认排序规则是 Cyrillic_General_CI_AS
在 SSMS 中执行
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS
或
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI
输出
- eEaAaAeEc?a on(in ocntext of/use dbName) 使用默认排序规则 Cyrillic_General_CI_AS
- éÉâÂàÀëËçæà 在数据库中使用默认排序规则 Latin1_General_CI_AS
为什么?
【问题讨论】:
标签:
sql
sql-server
internationalization
collation
codepages
【解决方案1】:
您查询中的那些字符文字首先在数据库设置的任何排序规则下转换为 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)
【解决方案2】:
根据this character table Cyrillic_General_CI_AS 不包含æ 字符。这可以解释为什么如果您真正使用默认值而不是您在 select 语句中的内容,您会在其位置看到 ?。