我正在尝试为WHERE某个字符串变量不为null或为空的地方编写一个子句.我遇到的问题是某些非空字符串等于N''文字.例如:
declare @str nvarchar(max) = N'?';
select case when @str = N'' then 1 else 0 end;
Run Code Online (Sandbox Code Playgroud)
收益率1.从我在维基百科上收集到的内容来看,这个特殊的unicode字符是用于淹没某些东西的象形图,它在语义上不等于空字符串.此外,字符串长度为1,至少在T-SQL中.
是否有更好(准确)的方法来检查空字符串的T-SQL变量?
我找到了一个博客,https://bbzippo.wordpress.com/2013/09/10/sql-server-collations-and-string-comparison-issues/
这解释了
问题是因为SQL Server的"默认"排序规则设置(SQL_Latin1_General_CP1_CI_AS)无法正确比较包含所谓的补充字符(4字节字符)的Unicode字符串.
修复是使用没有补充字符问题的排序规则.例如:
select case when N'?' COLLATE Latin1_General_100_CI_AS_KS_WS = N'' then 1 else 0 end;
Run Code Online (Sandbox Code Playgroud)
将返回0.有关更多示例,请参阅博客.
由于您要与空字符串进行比较,因此另一种解决方案是测试字符串长度.
declare @str1 nvarchar(max) =N'?';
select case when len(@str1) = 0 then 1 else 0 end;
Run Code Online (Sandbox Code Playgroud)
这将按预期返回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也可以解决此问题.
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |