【问题标题】:SQL Server 2019 CHARINDEX returns weird resultSQL Server 2019 CHARINDEX 返回奇怪的结果
【发布时间】:2020-10-30 19:06:43
【问题描述】:

当我在 SQL Server 2019 中运行以下查询时,结果为 1,而应该为 0。

select CHARINDEX('αρ', 'αυρ')

可能是什么问题?

【问题讨论】:

  • 事实上,您没有将N 放在您的文字前面以指定N[VAR]CHAR,因此受您默认的[VAR]CHAR 排序规则支持的支配。如果你这样做SELECT 'αρ', 'αυρ', N'αρ', N'αυρ',你应该会看到你的字符串是如何被破坏的。
  • 如果我将表中的任何字段定义为 nvarchar (max),它会自动获取 N 吗?因为我写了一个 sql 函数,当我运行它时 select DBO.splitstring(N'αυρ',N'αρ') /* resul is 0 / ,但是当我运行它时,select * from [yazitlar] where dbo .splitstring([yazit], N'αρ' ) = 1 order by idx / [yazit] 是 nvarchar(max) 并且返回的行只包含 Αὐρ */
  • 这很可能与您的dbo.SplitString 函数的定义方式有关,这不是问题所在。请注意Αὐρ 不是αυρ——这些字符串是否被认为是相同的,即使它们没有被破坏,也取决于列的排序规则(通常是数据库的排序规则,但可以是不同的)。排序规则指示比较结果,适用于 VARCHARNVARCHAR 类似;对于VARCHAR,它还决定了可以存储哪些字符。
  • 我能够更清楚地识别问题;选择 CHARINDEX( N'αρ',N'αὐρ' ) 结果为 1 ,选择 CHARINDEX( N'αρ', N'αυρ') 结果为 0

标签: sql-server charindex


【解决方案1】:

正如 cmets 中提到的,这可能是因为您没有将字符串文字声明为 Unicode 字符串,而是在字符串中使用了 Unicode 字符。 SQL Server 会将字符串转换为另一个代码页,并且做得不好。尝试运行此查询以查看差异。

SELECT 'αρ', 'αυρ', N'αρ', N'αυρ'

在我的服务器上,这给出了以下输出:

一个?一种?? αραυρ

另一个问题是 CHARINDEDX 使用了我认为在这种情况下可能没有正确设置的输入排序规则。您可以通过将其设置在其中一个输入上来强制进行排序。也可以在实例、数据库和列级别进行设置。

有不同的排序规则可能适用。它们具有不同的功能,例如有些区分大小写,有些则不区分。此外,并非所有排序规则都随每个 SQL Server 实例一起安装。值得运行SELECT * from sys.fn_helpcollations() 来查看所有已安装的描述。

如果您将查询更改为此,您应该会得到您正在寻找的结果。

SELECT CHARINDEX(N'αρ' COLLATE Greek_BIN, N'αυρ')

【讨论】:

  • 其实做unicode并没有改变情况,选择CHARINDEX( N'αρ',N'αὐρ' ) result = 1 ,选择CHARINDEX( N'αρ', N'αυρ') result = 0 希腊spiritus lenis 忽略它遇到的字符
  • 我在关于排序规则的回答中添加了一些额外的文字。
  • 非常感谢 Martin,当我选择 collat​​e 作为 Greek_BIN 时问题已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多