【问题标题】: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 语句中的内容,您会在其位置看到 ?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 2020-05-07
        • 2016-04-20
        相关资源
        最近更新 更多