标签:验证 ddn 字节 nbsp udf cbo 字符 qpi nsx
一、先说结论:
1、尾随空格不影响字符串的对比查询结果。
2、字符串的LEN(字符数(不含尾随空格))与DATALENGTH(字节数)可能不一样,需要根据实际业务场景选择使用。
二、问题描述:
一个字符串在与它后面加空格(尾随空格)的字符串,对比是否相等时,结果为什么是相等呢?
三、验证与分析:
先来看下面的SQL
DECLARE @strA VARCHAR(10) = ‘maco ‘; --后面多几个尾随空格
DECLARE @strB VARCHAR(10) = ‘maco‘;
--1、判断 @strA = @strB
IF (@strA = @strB)
SELECT @strA , @strB,‘@strA与@strB相等‘;
ELSE
SELECT @strA , @strB, ‘@strA与@strB不相等‘;
--运行结果 @strA与@strB相等
--2、判断 @strA =@strB and len(@strA)= len(@strB)
IF (@strA = @strB AND LEN(@strA) = LEN(@strB))
SELECT LEN(@strA) , LEN(@strB) , ‘@strA与@strB相等‘;
ELSE
SELECT LEN(@strA) , LEN(@strB) , ‘@strA与@strB不相等‘;
--运行结果 @strA与@strB相等
--3、判断 @strA =@strB and datalength(@strA)= datalength(@strB)
--判断两个字符串是否完全相等:在判断字符串内容是否一样的同时,用datalength比较字符串的字节数是否相等;
IF (@strA = @strB AND DATALENGTH(@strA) = DATALENGTH(@strB))
SELECT DATALENGTH(@strA) , DATALENGTH(@strB), ‘@strA与@strB相等‘;
ELSE
SELECT DATALENGTH(@strA) , DATALENGTH(@strB), ‘@strA与@strB不相等‘;
--运行结果 @strA与@strB不相等
--查看SQL Server的联机丛书发现:
--LEN()返回给定字符串表达式的字符数(不包含尾随空格),而不是返回字节数。DATALENGTH返回字节数。
--4、查看@str, LEN(), DATALENGTH()进行对比和验证如下:
SELECT @strA, LEN(@strA) [LEN字符数(不包含尾随空格)], DATALENGTH(@strA) DATALENGTH字节数
SELECT @strB, LEN(@strB) [LEN字符数(不包含尾随空格)], DATALENGTH(@strB) DATALENGTH字节数
因此我们也可以推出结论:尾随空格不影响字符串的对比查询结果。
如下SQL语句,均能查出SENO = ‘10000922031‘数据
SELECT TOP 10 * FROM [dbo].[BIGTABLE] WHERE SENO = ‘10000922031‘
SELECT TOP 10 * FROM [dbo].[BIGTABLE] WHERE SENO = ‘10000922031 ‘--含尾随空格
但以下SQL语句不能查出对应的数据(前置空格)
SELECT TOP 10 * FROM [dbo].[BIGTABLE] WHERE SENO = ‘ 10000922031‘--含尾随空格
(完)
SQL 有尾随空格字符串的比较与分析
标签:验证 ddn 字节 nbsp udf cbo 字符 qpi nsx
原文地址:https://www.cnblogs.com/mslong/p/13790151.html