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

解决方案 »

  1.   


    应该说这是 = 跟 LIKE 的区别两者的字符串匹配方式不一样. 对待空格的处理也不一样. =   会忽略字符串后面的空格 LIKE 会把字符串后面的空格当作是有意义的字符.(即会匹配)
      

  2.   

    关键是为啥select * from tb where col = 'bc1 '
    的时候也忽略空格
    而实际上数据库的数据是存储了空格的
      

  3.   

    这个问题不需要讨论吧?楼主看看联机帮助上的说明就知道了嘛.例如对 LEN 的说明是这样的:
    返回指定字符串表达式的字符数,其中不包含尾随空格。
      

  4.   


    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時用的是字符串
      

  5.   

    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
      

  6.   

    declare @s char(10)
    set @s = 'asdf '
    select @s,len(@s),datalength(@s)                       
    ---------- ----------- -----------
    asdf       4           10(1 行受影响)
      

  7.   


    --四个类型对比下
    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 '带空格呢
      

  8.   

    例如对 LEN 的说明是这样的: 
    返回指定字符串表达式的字符数,其中不包含尾随空格。
    邹老大是背过的,还是去现查的?
      

  9.   


    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
    --还有很多有意思的
      

  10.   

    declare @s char(10) 
    set @s = 'asdf ' 
    select @s,len(@s),datalength(@s)                       
    ---------- ----------- ----------- 
    asdf      4          10 (1 行受影响) 
      

  11.   

    --四个类型对比下 
    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 '带空格呢 这个还是没人解释下啊
      

  12.   

    18楼:请看4楼的解释啊. = 是会忽略字符串后的空格的例: "abc  " 等於 "abc" 等於  "abc     "  等於  "abc      "Name 
    ---------
    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          '
    结果都一样,三笔记录都会出来.
      

  13.   


    如果是这样,你不觉得是一个BUG么?如果我要查询'abc '这样的串,就是abc后带一个空格
    我的sql怎么写?
      

  14.   

    如果是这样,你不觉得是一个BUG么?如果我要查询'abc '这样的串,就是abc后带一个空格
    我的sql怎么写? >>>还是请看4楼 @_@WHERE Name LIKE 'abc '  --这样就会匹配'abc ' 的
      

  15.   


    是啊,这样就变成很可笑了,我要结果精确的等于'abc ',微软却告诉我:请用LIKE...
      

  16.   

     急求:本人欲在傲游(Maxthon)浏览器的工具栏上安装一个自定义按钮,该按钮的功能是:当我按下该按钮时,启动d:\euro\hot.exe程序(该程序功能是:在当前网页中,搜索关键字,并将搜索结果及相关字段内容存入名为Asia2008.dbf数据库中,关闭当前网页)。请各位大侠指点做法,如有可能给出相关源程序,小生万分感谢!([email protected])