详解SQL Server 比较带有尾随空格的字符串

2024-05-12 08:32

本文主要是介绍详解SQL Server 比较带有尾随空格的字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、问题描述

[sql]  view plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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. */  

原因详见下图:



2.2 为什么会出现这个问题,是尾随空格不参与比较吗?

个人认为不是这样的。

微软的帮助中曾经提到:ANSI 标准要求填充字符的字符串比较中使用,以使其长度匹配再进行比较。进行填充时,char 列用空格填充,binary 列用零填充。

LIKE 谓词表达式的右侧功能具有尾随空格的值时, SQL Server 不会填充到相同的长度在两个值比较发生之前。(上面的方式五,只是用like做个测试)

 

3、补充说明

说到尾随空格,不得不提到SET ANSI_PADDING

在 Microsoft SQL Server 的未来版本中,ANSI_PADDING 将始终为 ON,将该选项显式设置为 OFF 的任何应用程序都将产生错误。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

SET ANSI_PADDING:对列存储长度小于列的定义大小的值以及在 char、varchar、binary 和 varbinary 数据中含有尾随空格的值的方式进行控制。

SET ANSI_PADDING虽然在比较的时候不起作用,但是它直接控制了入口,如果设置了off,则剪裁插入 varchar 列中的字符值的尾随空格。

详见:

设置

char(n) NOT NULL 或 binary(n) NOT NULL

char(n) NULL 或 binary(n) NULL

varchar(n) 或 varbinary(n)

ON

填充原始值(char 列具有尾随空格的值,binary 列具有尾随零的值),使达到列的长度。

如果 SET ANSI_PADDING 为 ON,则遵从与 char(n) 或 binary(n) NOT NULL 相同的规则。

不剪裁插入 varchar 列中的字符值的尾随空格。 不剪裁插入 varbinary 列中的二进制值的尾随零。 不将值填充到列的长度。

OFF

填充原始值(char 列具有尾随空格的值,binary 列具有尾随零的值),使达到列的长度。

如果 SET ANSI_PADDING 为 OFF,则遵从与 varchar 或 varbinary 相同的规则。

剪裁插入 varchar 列中的字符值的尾随空格。 剪裁插入 varbinary 列中的二进制值的尾随零。

 

注:建议始终将 ANSI_PADDING 设置为 ON。

来源: 【叶子】http://blog.csdn.net/maco_wang 

这篇关于详解SQL Server 比较带有尾随空格的字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982120

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下