详解SQL Server 比较带有尾随空格的字符串
1、问题描述
[sql]view plaincopyprint?
1.declare @a varchar(10);set @a='maco '
2.declare @b varchar(10);set @b='maco'
3.if(@a=@b)
4.select'@a与@b相等'
5.else
6.select'@a与@b不相等'
7.--运行结果
8./*
9.@a与@b相等
10.*/
@a后面有尾随空格,@b后面没有,但是为什么他们相等呢?
2、问题解析
2.1 有尾随空格的情况下,如何才能准确的比较两个字符串?
下面介绍几种常见的方式:
[sql]view plaincopyprint?
1.declare @a varchar(10);set @a='maco '
2.declare @b varchar(10);set @b='maco'
3.
4.--第一种方式(两边都加上常量)
5.if(@a+'a'=@b+'a')
6.select'@a与@b相等'as方式一结果
7.else
8.select'@a与@b不相等'as方式一结果
[sql]view plaincopyprint?
1.--第二种方式(替换空格未char(13))
2.if(replace(@a,' ',char(13))=replace(@b,' ',char(13)))
3.select'@a与@b相等'as方式二结果
4.else
5.select'@a与@b不相等'as方式二结果
[sql]view plaincopyprint?
1.--第三种方式(都转成varbinary类型后再比较)
2.if(cast(@a as varbinary) = cast(@b as varbinary))
3.select'@a与@b相等'as方式三结果
字符串长度算不算空格4.else
5.select'@a与@b不相等'as方式三结果
[sql]view plaincopyprint?
1.--第四种方式(判断datalength)
2.if(@a=@b and datalength(@a)=datalength(@b))
3.select'@a与@b相等'as方式四结果
4.else
5.select'@a与@b不相等'as方式四结果
[sql]view plaincopyprint?
1.--第五种方式(用like)
2.if(@a=@b and @a like @b and @b like @a)
3.select'@a与@b相等'as方式五结果
4.else
5.select'@a与@b不相等'as方式五结果
6.
7.--运行结果
8./*
9.方式一结果
10.------------
11.@a与@b不相等
12.
13.(1 row(s) affected)
14.
15.方式二结果
16.------------
17.@a与@b不相等
18.
19.(1 row(s) affected)
20.
21.方式三结果
22.------------
23.@a与@b不相等
24.
25.(1 row(s) affected)
26.
27.方式四结果
28.------------
29.@a与@b不相等
30.
31.(1 row(s) affected)
32.
33.方式五结果
34.------------
35.@a与@b不相等
36.
37.(1 row(s) affected)
38.*/
这里特别要说明的是用len判断是不行的。
[sql]view plaincopyprint?
1.declare @a varchar(10);set @a='maco '
2.declare @b varchar(10);set @b='maco'
3.if(@a=@b and len(@a)=len(@b))
4.select'@a与@b相等'as方式六结果
5.else
6.select'@a与@b不相等'as方式六结果
7./*
8.方式六结果
9.----------
10.@a与@b相等
11.*/
原因详见下图:
© 【叶子】blog.csdn/maco_wang 原创作品,转贴请注明作者和出处,留此信息。
2.2 为什么会出现这个问题,是尾随空格不参与比较吗?
个人认为不是这样的。
微软的帮助中曾经提到:ANSI 标准要求填充字符的字符串比较中使用,以使其长度匹配再进行比较。进行填充时,char 列用空格填充,binary 列用零填充。
LIKE 谓词表达式的右侧功能具有尾随空格的值时, SQL Server 不会填充到相同的长度在两个值比较发生之前。(上面的方式五,只是用like做个测试)
3、补充说明
说到尾随空格,不得不提到SET ANSI_PADDING

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。