SqlServer 带空格的字符串比较
介绍
SqlServer 字符串比较,会匹配具有尾随空格的字符串
字符串比较规则
SQL Server 数据库引擎遵循有关如何比较包含空格的字符串的 ANSI/ISO SQL-92 规范(第 8.2 节“比较谓词”,第 3 条通用规则)。 ANSI 标准要求对比较中使用的字符串进行填充,以便在比较字符串之前匹配长度。 填充直接影响 WHERE
和 HAVING
子句谓词的语义以及其他 Transact-SQL 字符串比较。 例如,对于大多数比较操作,Transact-SQL 将 'abc'
和 'abc '
视为等效的字符串。 此规则的唯一例外是 LIKE 谓词。 如果 LIKE
谓词表达式的右侧具有尾随空格的值,则数据库引擎不会在进行比较之前将两个值填充到相同的长度。 原因在于,根据定义,LIKE
谓词旨在促进模式搜索而不是简单的字符串相等性测试,所以该谓词并未违反前面提到的 ANSI SQL-92 规范部分。
参考文档
示例
创建测试数据
create table #ceshi(bh varchar(10))
insert into #ceshi
values('abc'), ('abc '), ('abc ')
使用 =
查询
使用 =
查询,会匹配左右两侧具有尾随空格的值
SELECT * FROM #ceshi WHERE bh = 'abc'
SELECT * FROM #ceshi WHERE bh = 'abc '
SELECT * FROM #ceshi WHERE bh = 'abc '
查询结果
| bh |
| ---- |
|abc|
|abc |
|abc |
使用 like
查询
使用 like
查询,会匹配左侧具有尾随空格的值
SELECT * FROM #ceshi WHERE bh like 'abc'
查询结果
| bh |
| ---- |
|abc|
|abc |
|abc |
SELECT * FROM #ceshi WHERE bh like 'abc '
查询结果
| bh |
| ---- |
|abc |
|abc |
SELECT * FROM #ceshi WHERE bh like 'abc '
查询结果
| bh |
| ---- |
|abc |
获取具有尾随空格字符的长度
使用 LEN
获取的长度不含尾随空格, DATALENGTH
获取的长度含尾随空格
SELECT LEN(bh) as LEN_, DATALENGTH(bh) DATALENGTH_, * FROM #ceshi
查询结果
| LEN_ | DATALENGTH_ | bh |
| ---- | ----------- | ---- |
| 3 | 3 |abc|
| 3 | 4 |abc |
| 3 | 5 |abc |
使用 =
查询精确匹配
-
左右两侧增加字符的方式
SELECT * FROM #ceshi WHERE bh + '|' = 'abc ' + '|'
-
使用
DATALENGTH
函数SELECT * FROM #ceshi WHERE bh = 'abc ' and DATALENGTH(bh) = DATALENGTH('abc ')