【发布时间】: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''确实返回1。SELECT 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