今天遇到一个sql的奇怪bug:
    chrw(31)是不可见字符,"fuck15"+chrw(31)+"789"组成的字符串在sql里显示是"fuck15`789",5和7中间有一个不可见的字符,暂用"`"代替。
    在查询的时候,where语句是lotno > "fuck15!789" 居然把"fuck15`789"那条记录也查询出来啦,
“!”是ASCII码里最小的可见字符,即chr(33),但比chr(31)大,"fuck15"+chrw(31)+"789"小于"fuck15"+chrw(33)+"789",
"fuck15`789"这条记录不应该被查询出来,但是结果是"fuck15`789"那条记录被查询出来啦,哪位大神能解释一下

解决方案 »

  1.   

    字符串的比较不是通过ASCII码来比较的,字符串大小的比较是通过选择的排序规则
      

  2.   


    --经测,没被选出来
    with t(col) as(
    select 'fuck15'+char(31)+'789'
    union all select 'fuck15!789'
    union all select 'fuck15'+char(33)+'789'
    )
    select * from t where col>='fuck15!789'
    /*
    col
    ----------
    fuck15!789
    fuck15!789(2 row(s) affected)
    */
      

  3.   

    'fuck15'+char(31)+'789' 是通过vb.net更新到数据库的,你这样写和我说的不一样,'fuck15'+char(31)+'789'在数据库里是“fuck15789”这种情况出现的
      

  4.   

    不一样吧,'fuck15'+char(31)+'789'是通过vb.net更新到数据库的,它在数据库的显示形式是'fuck15789',不一样啊