3

概述

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' )-- 返回错误的 1
  • 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)-- 返回错误的 1

Latin1...排序规则是否存在已知错误?

4

2 回答 2

2

这将返回正确的结果:

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 实现。在未来的 SQL Server 版本中将继续支持 BIN 和 BIN2 排序规则。

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

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

使用二进制排序规则的指南

如果您的 Microsoft SQL Server 2005 应用程序与使用二进制排序规则的旧版本 SQL Server 交互,请继续使用二进制。对于混合环境,二进制排序规则可能是更合适的选择。

使用 BIN2 排序规则的指南

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

IE。BIN2排序规则相当于使用Ordinalin C#wrt to charindex

于 2016-10-20T03:34:00.970 回答
2

这不是特定于 SQL Server 的任何东西。

在 C# 中

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

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

或在记事本中单击下面的“全部替换”

在此处输入图像描述

导致

在此处输入图像描述

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

对于大多数地区(冰岛除外)的人来说,刺字符 þ扩展为th.

在 Michael S. Kaplan 的这篇文章中有更多关于这个具体案例的信息每朵玫瑰都有它的 Þ .... 该博客包含大量有关 Windows 排序规则的信息。此处更详细地描述了扩展。

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

于 2016-10-22T12:36:07.340 回答