我正在尝试为某个字符串变量不为null或为空的地方写一个WHERE
子句。我遇到的问题是某些非空字符串等于N''
字面值。例如:
declare @str nvarchar(max) = N'㴆';
select case when @str = N'' then 1 else 0 end;
收益1.从我在Wikipedia收集的内容来看,这个特殊的unicode字符是用于淹没某些东西的象形图,它在语义上不等于空字符串。此外,字符串长度为1,至少在T-SQL中。
是否有更好(准确)的方法来检查空字符串的T-SQL变量?
答案 0 :(得分:6)
我找到了一个博客https://bbzippo.wordpress.com/2013/09/10/sql-server-collations-and-string-comparison-issues/
解释了
问题是因为“默认”排序规则设置 (SQL_Latin1_General_CP1_CI_AS)对于SQL Server无法正常比较 包含所谓的补充字符的Unicode字符串 (4字节字符)。
修复是使用没有补充字符问题的排序规则。例如:
select case when N'㴆' COLLATE Latin1_General_100_CI_AS_KS_WS = N'' then 1 else 0 end;
将返回0.有关更多示例,请参阅博客。
由于您要与空字符串进行比较,因此另一种解决方案是测试字符串长度。
declare @str1 nvarchar(max) =N'㴆';
select case when len(@str1) = 0 then 1 else 0 end;
这将按预期返回0。
当字符串为空时,这也会产生0。
修改强>
感谢devio的评论,我深入挖掘并发现了Erland Sommarskog的评论https://groups.google.com/forum/#!topic/microsoft.public.sqlserver.server/X8UhQaP9KF0
除了不支持补充字符外,Latin1_General_CP1_CI_AS排序规则不能正确处理新的Unicode字符。所以我猜测㴆字符是一个新的Unicode字符。
指定排序规则Latin1_General_100_CI_AS
也可以解决此问题。