搜索刺时,CHARINDEX在某些COLLATION中返回错误的结果(字符254)

时间:2016-10-19 05:40:14

标签: sql sql-server collation charindex

概述

使用如下的校对序列时,

CHARINDEX偶尔会返回错误的值:

Latin1_General_CI_AS 

但可以使用如下的校对序列:

SQL_Latin1_General_CP1_CI_AS

在MS SQL Server 2008 R2和SQL Server 2016上遇到过这种情况。

实施例

假设数据库整理顺序为:

Latin1_General_CI_AS
  • print CHARINDEX( CHAR(254), 'Tþ' ) - 返回2,这是正确的
  • print CHARINDEX( CHAR(254), 'Th' ) - 返回错误的错误
  • print CHARINDEX( CHAR(253), 'Th' ) - 返回0,这是正确的
  • print CHARINDEX( CHAR(254) Collate SQL_Latin1_General_CP1_CI_AS, 'Thþ' Collate SQL_Latin1_General_CP1_CI_AS) - 返回3,这是正确的
  • print CHARINDEX( CHAR(254) Collate Latin1_General_CI_AS, 'Thþ' Collate Latin1_General_CI_AS) - 返回错误的错误

Latin1...归类序列是否存在已知错误?

2 个答案:

答案 0 :(得分:2)

这不是SQL Server特有的任何内容。

在C#中

string.Compare("þ", "th", false, new System.Globalization.CultureInfo(1033))

返回0,表示字符串比较相等。

或在记事本中点击"全部替换"以下

enter image description here

导致

enter image description here

在不以" SQL"开头的SQL Server排序规则中使用Windows排序规则。

对于大多数语言环境中的人(冰岛是个例外),thorn character þ会扩展为th

Michael S. Kaplan Every rose has it's Þ....在这篇文章中提供了有关此特定案例的更多信息。该博客有大量关于Windows排序规则的信息。扩展是described in more detail here

如果您不想要这些语义,则需要使用您想要的语义(可能是通过显式collate子句)进行排序规则(可能是SQL或二进制)。

答案 1 :(得分:1)

这将返回正确的结果:

select CHARINDEX( NCHAR(254) Collate Latin1_General_BIN2, N'Tþ' Collate Latin1_General_BIN2)
select CHARINDEX( NCHAR(254) Collate Latin1_General_BIN2, N'Th' Collate Latin1_General_BIN2 )
select CHARINDEX( NCHAR(253) Collate Latin1_General_BIN2, N'Th' Collate Latin1_General_BIN2 )
select CHARINDEX( NCHAR(254) Collate Latin1_General_BIN2, N'Thþ' Collate Latin1_General_BIN2)

文档说:

  

使用二进制排序

     

以下注意事项将帮助您确定旧的或新的二进制排序规则是否适合您的Microsoft SQL Server   实现。将继续支持BIN和BIN2排序规则   在将来的SQL Server版本中。

     

二进制排序规则根据特定代码页中定义的编码值序列对数据进行排序。 SQL Server中的二进制排序规则   定义语言区域设置和要使用的ANSI代码页,   强制执行二进制排序。二进制排序规则很有用   由于其相对性而实现了改善的应用性能   简单。

     

SQL Server中的先前二进制排序规则对Unicode数据执行了不完整的代码点到代码点比较   SQL Server二进制排序规则将第一个字符比作WCHAR,   然后进行逐字节比较。为了向后兼容   原因,现有的二进制排序规则语义不会改变。

     

使用二进制排序规则

     

如果Microsoft SQL Server 2005应用程序与使用二进制排序规则的旧版SQL Server交互,请继续使用   二进制文件。二元整理可能是混合的更合适的选择   的环境中。

     

使用BIN2归类的指南

     

此版本的SQL Server中的二进制排序规则包括一组新的纯代码点比较排序规则。客户可以选择   迁移到新的二进制排序规则以利用true   代码点比较,他们应该使用新的二进制文件   用于开发新应用程序的排序规则。新的BIN2后缀   标识实现新代码点排序规则的排序规则名称   语义。另外,添加相应的新比较标志   到BIN2进行新的二进制排序。优点包括更简单   应用程序开发和更清晰的语义。

IE。 BIN2整理相当于在Ordinal wrt C#中使用charindex