【问题标题】:Character misbehaving in SQL Select statementSQL Select 语句中的字符行为异常
【发布时间】:2025-12-29 14:35:04
【问题描述】:

我遇到了一些 select 语句的问题,或者更准确地说是它们返回的问题。

我正在尝试从空白的名称字段(汉字字符)中检索行,使用如下 where 子句:

name IS NULL OR name = ''

我知道还有其他方法可以做到这一点,我已经尝试过这些方法,但这会返回除此之外我需要的东西。

当我使用上述字符搜索数据库时,它会返回自身和空白行。似乎没有其他角色有这种行为。

有人建议这可能是排序规则问题。列排序规则设置为 Latin_General_CI_AS。

真的只是在寻找一个原因,说明为什么单个角色的行为会与其他所有角色不同。

如果需要更多信息,请询问。

【问题讨论】:

  • 如果我是对的,Latin1-General 是代码页 windows-1252。此代码页中的所有字符都列在这里:fileformat.info/info/charset/windows-1252/list.htm - 所以我认为汉字字符被拆分为多个匹配 CP1252 的字符。甚至可能超出有效字符范围。
  • 很好奇。 SELECT 1 WHERE N'䑓' = N'' 确实返回 1SELECT 1 WHERE N'䑓' = N'' COLLATE Latin1_General_BIN2 当然没有。但即使COLLATE Japanese_CI_AS 也认为这是空白。 COLLATE Japanese_Bushu_Kakusu_140_CS_AI 没有,在我的机器上。 (但是这很有效——我不是日语排序规则的专家。)您可以使用DATALENGTH = 0 测试“真正的空白”,但我很确定它不能用于索引搜索。它可能与= N''结合
  • 如果你这样做name = N''?它的行为如何?
  • @JimmyPop13 那么你必须使用排序规则 - dimantdatabasesolutions.blogspot.com/2010/10/…
  • 在 SQL Server 2012 上(对于我的目的来说已经足够老了)WHERE col IS NULL OR (col = N'' AND col = N'' COLLATE Latin1_General_BIN2) 仍将在列上使用索引(仅使用 _BIN2 不会)。 YMMV,但这似乎是一种很有前途的方法。

标签: sql sql-server where collation


【解决方案1】:

为什么不试试

isnull(name, '') = ''

更新

isnull(nullif(name, '䑓'), '') = ''

【讨论】:

  • 这只是WHERE Name = '' OR NAME IS NULL 的性能较差的版本,并不能解决根本问题。 ISNULL(N'䑓', '') = '' 仍然正确。