使用SC Collat​​ion进行SQL Server Unicode查询

Rah*_*ksu 6 sql-server unicode sql-server-2012

在SQL Server 2012中,我有一个带有nvarchar列的表,其列表为Latin1_General_100_CI_AS_ SC,它应该支持unicode代理项对字符或补充字符.

  1. 当我运行此查询时:

    select KeyValue from terms where KeyValue = N'?'
    
    Run Code Online (Sandbox Code Playgroud)

    (上面是一个Unicode SC)
    上面是一个卷曲循环字符,代码为10160(x27B0)
    结果是数百个不同的单个字符条目,即使它们都有不同的UTF-16代码点.这是归因于整理吗?为什么没有完全匹配?

    编辑:我现在认为这是由于整理.在UTF-16范围内似乎有一组"未定义"字符,超过1733个字符,并且通过此排序规则将它们视为相同.虽然代码高于65535的字符被视为唯一,但这些查询返回完全匹配.

  2. 以下两个查询有不同的结果:

    select KeyValue from terms where KeyValue = N'?'
    
    Run Code Online (Sandbox Code Playgroud)

    返回3行:π和π和ᴨ

    select KeyValue from terms where KeyValue LIKE N'?'
    
    Run Code Online (Sandbox Code Playgroud)

    返回2行:π和π

    这是为什么?

  3. 这是最奇怪的.这个查询:

    select KeyValue from terms where KeyValue like N'?%'
    
    Run Code Online (Sandbox Code Playgroud)

    返回表中的ALMOST ALL记录,其中包含许多多字符常规拉丁字符集术语,如"8w"或"apple".没有退回的人中有90%是以"æ"开头的.怎么了?

注意:只是为了给出一些上下文,这些都是维基百科的文章标题,而不是随机字符串.

Bil*_*ill 1

SQL Server 和 tempdb 也有自己的排序规则,它们可能与数据库或列的排序规则不同。虽然应该为字符文字分配列或数据库的默认排序规则,但上述(可能过于简化)T-SQL 示例可能会错误表述/未揭示真正的问题。例如,为了简单起见,可以省略 ORDER BY 子句。当上述语句明确使用https://msdn.microsoft.com/en-us/library/ms184391.aspx ('COLLATE Latin1_General_100_CI_AS_SC')时,是否返回预期结果?