详解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

相关文章

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

MySQL 中的 LIMIT 语句及基本用法

《MySQL中的LIMIT语句及基本用法》LIMIT语句用于限制查询返回的行数,常用于分页查询或取部分数据,提高查询效率,:本文主要介绍MySQL中的LIMIT语句,需要的朋友可以参考下... 目录mysql 中的 LIMIT 语句1. LIMIT 语法2. LIMIT 基本用法(1) 获取前 N 行数据(

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Python中局部变量和全局变量举例详解

《Python中局部变量和全局变量举例详解》:本文主要介绍如何通过一个简单的Python代码示例来解释命名空间和作用域的概念,它详细说明了内置名称、全局名称、局部名称以及它们之间的查找顺序,文中通... 目录引入例子拆解源码运行结果如下图代码解析 python3命名空间和作用域命名空间命名空间查找顺序命名空

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll