CREATE TABLE test1
(
id int
,c1 varchar(10)
,c2 char(10)
,c3 nvarchar(10)
,c4 nchar(10)
)
INSERT INTO test1 values(1,'nobc1','nobc2','nobc3','nobc4')
INSERT INTO test1 VALUES(1,'bc1 ','bc2 ','bc3 ','bc4 ')
INSERT INTO test1 VALUES(1,' bc1',' bc2 ',' bc3 ',' bc4 ')
INSERT INTO test1 VALUES(1,'bc1','bc2','bc3','bc4')
select DATALENGTH(c1),DATALENGTH(C2),DATALENGTH(C3),DATALENGTH(C4) from test1
drop table test1----------- ----------- ----------- -----------
5 10 10 20
4 10 8 20
4 10 10 20
3 10 6 20
(
id int
,c1 varchar(10)
,c2 char(10)
,c3 nvarchar(10)
,c4 nchar(10)
)
INSERT INTO test1 values(1,'nobc1','nobc2','nobc3','nobc4')
INSERT INTO test1 VALUES(1,'bc1 ','bc2 ','bc3 ','bc4 ')
INSERT INTO test1 VALUES(1,' bc1',' bc2 ',' bc3 ',' bc4 ')
INSERT INTO test1 VALUES(1,'bc1','bc2','bc3','bc4')
select DATALENGTH(c1),DATALENGTH(C2),DATALENGTH(C3),DATALENGTH(C4) from test1
drop table test1----------- ----------- ----------- -----------
5 10 10 20
4 10 8 20
4 10 10 20
3 10 6 20
应该说这是 = 跟 LIKE 的区别两者的字符串匹配方式不一样. 对待空格的处理也不一样. = 会忽略字符串后面的空格 LIKE 会把字符串后面的空格当作是有意义的字符.(即会匹配)
的时候也忽略空格
而实际上数据库的数据是存储了空格的
返回指定字符串表达式的字符数,其中不包含尾随空格。
SET SHOWPLAN_ALL on ;可看到區別SELECT * FROM test1 WHERE c1='bc1 '
|--Table Scan(OBJECT:([tempdb].[dbo].[test1]), WHERE:([tempdb].[dbo].[test1].[c1]=[@1]))SELECT * FROM test1 WHERE c1 LIKE 'bc1 '
|--Table Scan(OBJECT:([tempdb].[dbo].[test1]), WHERE:([tempdb].[dbo].[test1].[c1] like 'bc1 '))用=時SQL引擎是用一個變量傳參
用like時用的是字符串
(
id int
,c1 varchar(10)
,c2 char(10)
,c3 nvarchar(10)
,c4 nchar(10)
)
INSERT INTO test1 values(1,'nobc1','nobc2','nobc3','nobc4')
INSERT INTO test1 VALUES(1,'bc1 ','bc2 ','bc3 ','bc4 ')
INSERT INTO test1 VALUES(1,' bc1',' bc2 ',' bc3 ',' bc4 ')
INSERT INTO test1 VALUES(1,'bc1','bc2','bc3','bc4')
select DATALENGTH(c1),DATALENGTH(C2),DATALENGTH(C3),DATALENGTH(C4) from test1
drop table test1
set @s = 'asdf '
select @s,len(@s),datalength(@s)
---------- ----------- -----------
asdf 4 10(1 行受影响)
--四个类型对比下
CREATE TABLE test1
(
id int
,c1 varchar(10)
,c2 char(10)
,c3 nvarchar(10)
,c4 nchar(10)
)
INSERT INTO test1 values(1,'nobc1','nobc2','nobc3','nobc4')
INSERT INTO test1 VALUES(1,'bc1 ','bc2 ','bc3 ','bc4 ')
INSERT INTO test1 VALUES(1,' bc1 ',' bc2 ',' bc3 ',' bc4 ')
INSERT INTO test1 VALUES(1,'bc1','bc2','bc3','bc4')--把有后续空格的那个也查出来了,实际数据库存储了空格
--四个数据类型是一样的
SELECT * FROM test1
WHERE c1 = 'bc1'这个语句的运行结果是
1 bc1 bc2 bc3 bc4
1 bc1 bc2 bc3 bc4 也就是说实际上他把INSERT INTO test1 VALUES(1,'bc1 ','bc2 ','bc3 ','bc4 ')这一条也查出来了
这一条实际在数据库中存的是'bc1 '带空格呢
返回指定字符串表达式的字符数,其中不包含尾随空格。
邹老大是背过的,还是去现查的?
IF '' = 0 PRINT 1 ELSE PRINT 2
--1
PRINT ASCII('')
--
IF '' <> NULL
PRINT 1
ELSE
PRINT 2
--2
IF '' = NULL
PRINT 1
ELSE
PRINT 2
--2
--还有很多有意思的
set @s = 'asdf '
select @s,len(@s),datalength(@s)
---------- ----------- -----------
asdf 4 10 (1 行受影响)
CREATE TABLE test1
(
id int
,c1 varchar(10)
,c2 char(10)
,c3 nvarchar(10)
,c4 nchar(10)
)
INSERT INTO test1 values(1,'nobc1','nobc2','nobc3','nobc4')
INSERT INTO test1 VALUES(1,'bc1 ','bc2 ','bc3 ','bc4 ')
INSERT INTO test1 VALUES(1,' bc1 ',' bc2 ',' bc3 ',' bc4 ')
INSERT INTO test1 VALUES(1,'bc1','bc2','bc3','bc4') --把有后续空格的那个也查出来了,实际数据库存储了空格
--四个数据类型是一样的
SELECT * FROM test1
WHERE c1 = 'bc1' 这个语句的运行结果是
1 bc1 bc2 bc3 bc4
1 bc1 bc2 bc3 bc4 也就是说实际上他把INSERT INTO test1 VALUES(1,'bc1 ','bc2 ','bc3 ','bc4 ')这一条也查出来了
这一条实际在数据库中存的是'bc1 '带空格呢 这个还是没人解释下啊
---------
abc --(abc後不带空格)
abc --(abc後带两个空格)
abc --(abc後带三个空格)SELECT * FROM TableN WHERE Name='abc'
SELECT * FROM TableN WHERE Name='abc '
SELECT * FROM TableN WHERE Name='abc '
SELECT * FROM TableN WHERE Name='abc '
结果都一样,三笔记录都会出来.
如果是这样,你不觉得是一个BUG么?如果我要查询'abc '这样的串,就是abc后带一个空格
我的sql怎么写?
我的sql怎么写? >>>还是请看4楼 @_@WHERE Name LIKE 'abc ' --这样就会匹配'abc ' 的
是啊,这样就变成很可笑了,我要结果精确的等于'abc ',微软却告诉我:请用LIKE...