SqlServer 带空格的字符串比较

发布时间 2023-07-27 19:57:30作者: txgh

SqlServer 带空格的字符串比较

介绍

SqlServer 字符串比较,会匹配具有尾随空格的字符串

字符串比较规则

SQL Server 数据库引擎遵循有关如何比较包含空格的字符串的 ANSI/ISO SQL-92 规范(第 8.2 节“比较谓词”,第 3 条通用规则)。 ANSI 标准要求对比较中使用的字符串进行填充,以便在比较字符串之前匹配长度。 填充直接影响 WHEREHAVING 子句谓词的语义以及其他 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  |

使用 = 查询精确匹配

  1. 左右两侧增加字符的方式

    SELECT * FROM #ceshi WHERE bh + '|' = 'abc ' + '|'
    
  2. 使用DATALENGTH函数

    SELECT * FROM #ceshi WHERE bh = 'abc ' and DATALENGTH(bh) = DATALENGTH('abc ')