文档章节

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

吖唛喋
 吖唛喋
发布于 2015/04/30 15:30
字数 1091
阅读 25
收藏 0
点赞 0
评论 0

1、问题描述

declare @a varchar(10);set @a='maco '  
declare @b varchar(10);set @b='maco'  
if(@a=@b)  
    select '@a与@b相等'  
else  
    select '@a与@b不相等'  
--运行结果  
/*  
@a与@b相等  
*/  

@a后面有尾随空格,@b后面没有,但是为什么他们相等呢?

2、问题解析

2.1 有尾随空格的情况下,如何才能准确的比较两个字符串?

下面介绍几种常见的方式:

declare @a varchar(10);set @a='maco '  
declare @b varchar(10);set @b='maco'  
  
--第一种方式(两边都加上常量)  
if(@a+'a'=@b+'a')  
    select '@a与@b相等' as 方式一结果  
else   
    select '@a与@b不相等' as 方式一结果  


--第二种方式(替换空格未char(13))  
if(replace(@a,' ',char(13))=replace(@b,' ',char(13)))  
    select '@a与@b相等' as 方式二结果  
else  
    select '@a与@b不相等' as 方式二结果  


--第三种方式(都转成varbinary类型后再比较)  
if(cast(@a as varbinary) = cast(@b as varbinary))  
    select '@a与@b相等' as 方式三结果  
else  
    select '@a与@b不相等' as 方式三结果  


--第四种方式(判断datalength)  
if(@a=@b and datalength(@a)=datalength(@b))  
    select '@a与@b相等' as 方式四结果  
else   
    select '@a与@b不相等' as 方式四结果  


--第五种方式(用like)  
if(@a=@b and @a like @b and @b like @a)  
    select '@a与@b相等' as 方式五结果  
else   
    select '@a与@b不相等' as 方式五结果  
  
--运行结果  
/*  
方式一结果  
------------  
@a与@b不相等  
  
(1 row(s) affected)  
  
方式二结果  
------------  
@a与@b不相等  
  
(1 row(s) affected)  
  
方式三结果  
------------  
@a与@b不相等  
  
(1 row(s) affected)  
  
方式四结果  
------------  
@a与@b不相等  
  
(1 row(s) affected)  
  
方式五结果  
------------  
@a与@b不相等  
  
(1 row(s) affected)  
*/  

这里特别要说明的是用len判断是不行的。

declare @a varchar(10);set @a='maco '  
declare @b varchar(10);set @b='maco'  
if(@a=@b and len(@a)=len(@b))  
    select '@a与@b相等' as 方式六结果  
else   
    select '@a与@b不相等' as 方式六结果  
/*  
方式六结果  
----------  
@a与@b相等  
*/  

原因详见下图:

© 【叶子】http://blog.csdn.net/maco_wang 原创作品,转贴请注明作者和出处,留此信息。

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/article/details/7016630

共有 人打赏支持
吖唛喋
粉丝 0
博文 2
码字总数 0
作品 0
襄阳
程序员
3.《SQLSERVER2012之T-SQL教程》T-SQL单表查询(三)

表结构与数据:https://github.com/XuePeng87/TSQLV4 使用字符数据 设计字符数据的查询操作,包括数据类型、排序规则、运算符和函数,以及模式匹配。 数据类型 SQL Server支持两种字符数据类...

巧乐兹 ⋅ 2016/10/25 ⋅ 0

《SQLSERVER2012之T-SQL教程》T-SQL单表查询(三)

表结构与数据:https://github.com/XuePeng87/TSQLV4 使用字符数据 设计字符数据的查询操作,包括数据类型、排序规则、运算符和函数,以及模式匹配。 数据类型 SQL Server支持两种字符数据类...

杰克鹏仔 ⋅ 2016/11/09 ⋅ 0

SQL Server 字符串处理函数

ASCII:返回字符表达式中最左侧的字符的 ASCII 代码值。 select ASCII(expression) CHAR:将 int ASCII 代码转换为字符。 CHAR 可用于将控制字符插入字符串中 制表符 char(9) 换行符 char(10)...

子曰疯 ⋅ 2014/01/13 ⋅ 0

EntityFramework之原始查询及性能优化(六)

前言 在EF中我们可以通过Linq来操作实体类,但是有些时候我们必须通过原始sql语句或者存储过程来进行查询数据库,所以我们可以通过EF Code First来实现,但是SQL语句和存储过程无法进行映射,...

SourceBird ⋅ 2015/09/02 ⋅ 0

T-SQL中常用的set语句

1、SET ANSI_DEFAULTS { ON | OFF }示例: 设置 SET ANSI_DEFAULTS ON 并使用 DBCC USEROPTIONS 语句显示受影响的设置。 2、SET ANSI_NULLS { ON | OFF }T-SQL 支持在与空值进行比较时,允许...

AlunE ⋅ 2017/12/22 ⋅ 0

Sql Server中常用的字符串函数

len(expression) 返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。 datalength(Char_expr)返回字符串包含字符数,但不包含后面的空格 length(expression,variable)指定字...

学习也休闲 ⋅ 2015/09/23 ⋅ 0

SQLServer常用内置函数解析

SQLServer是我们在软件开发中经常使用到的数据库,对SQLServer的操作有又掌握多少呢?对于我们从底层做起的程序员来说,对SQLServer的增、删、查、改肯定是没有问题的;我想问大家一下,你知...

憨豆1号 ⋅ 2013/02/28 ⋅ 0

spool命令示例

spool命令示例: 以下保存为SQL脚本,在SQLPlus中运行 set echo off set timing off --关闭返回执行时间 set heading off --设置不显示列名 set feedback off --设置不返回选择数据行数 set ...

ZhangPlume ⋅ 2011/07/28 ⋅ 0

SQL Server-数据类型(七)

前言 前面几篇文章我们讲解了索引有关知识,这一节我们再继续我们下面内容讲解,简短的内容,深入的理解,Always to review the basics。 数据类型 SQL Server支持两种字符数据类型,一种是常...

jeffcky ⋅ 2016/12/01 ⋅ 0

MySQL 数据类型 详解

数值类型   MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 My...

huntering ⋅ 2014/04/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android JNI 读写Bitmap的方法

Java层创建Bitmap,通过JNI将Bitmap传到C/C++进行处理 Java部分 public static native boolean greenBitmap(Bitmap bitmap); C/C++部分 JNIEXPORT jboolean JNICALL Java_com_test_Test_gree......

国仔饼 ⋅ 8分钟前 ⋅ 0

一次性让你懂async/await,解决回调地狱

什么是async? 欢迎留言讨论 async 函数是 Generator 函数的语法糖。使用 关键字 async 来表示,在函数内部使用 await 来表示异步。相较于 Generator,async 函数的改进在于下面四点: 内置执...

阿K1225 ⋅ 8分钟前 ⋅ 0

angular常用命令

.下载更新操作 1.利用npm下载angular的命令行工具AngularCLI: npm install -g @angular/cli 2.下载jquery: npm install --save jquery 3.更新npm: npm i -g npm 4.更新angular: ng update ......

消散了的诗意 ⋅ 10分钟前 ⋅ 0

window.print 页面打印

定义和用法 print() 方法用于打印当前窗口的内容。 语法 window.print(); window.print() 实际上,是浏览器打印功能菜单的一种程序调用。与点击打印功能菜单一样,不能精确分页,不能设置纸型...

初学者的优化 ⋅ 11分钟前 ⋅ 0

魔兽世界 7.0版本上 PVE装备全攻略

  T套 因为大家应该都会打穿副本的所以具体是哪个boss我就不说了。   T1: 所有套装都在【熔火之心】出   T2: 头原来是在【奥妮克希亚的巢穴】改到黑翼之巢的奈法利安了,腿是在【熔火之...

wangchen1999 ⋅ 11分钟前 ⋅ 0

java.math.BigDecimal使用小结

原文地址 java.math.BigDecimal使用小结 divide方法 使用BigDecimal.divide方法时一定要考虑: 除数是否为0 商是否是无限小数 正确的使用方式 判断除数是否为0,是0做另外的处理逻辑 调用除法...

666B ⋅ 14分钟前 ⋅ 0

关于qstring转char乱码问题。

if (OpenClipboard(NULL)) { HGLOBAL hgClip; EmptyClipboard(); QByteArray byay = FValue.toLocal8Bit(); //转latin编码 char *bochsrc_line = byay.data(); hgClip = GlobalAlloc(GMEM_DD......

backtrackx ⋅ 15分钟前 ⋅ 0

了解SSH加密和连接过程

介绍 SSH或安全shell是安全协议,也是安全管理远程服务器的最常用方式。通过使用多种加密技术,SSH提供了一种机制,用于在双方之间建立加密安全连接,对彼此进行身份验证,以及来回传递命令和...

吴伟祥 ⋅ 21分钟前 ⋅ 0

微信小程序

小程序的基础配置:导航栏和tabbar 在app.json文件中配置导航栏和tabrbar 导航栏的设置 设置导航,背景黑色,文字白色,文字内容 { "pages":[ "pages/index/index", "pages/logs/l...

上官清偌 ⋅ 24分钟前 ⋅ 0

【转】百度坐标坐标系之间的转换(JS版代码)

/** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换 *///定义一些常量var x_PI = 3.1415926535897932...

HAVENT ⋅ 26分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部