日期:2014-05-17  浏览次数:20697 次

SQL里有不可见字符查询中遇到的奇怪BUG,求解
今天遇到一个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"那条记录被查询出来啦,哪位大神能解释一下

------解决方案--------------------
字符串的比较不是通过ASCII码来比较的,字符串大小的比较是通过选择的排序规则
------解决方案--------------------
SQL code

--经测,没被选出来
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)
*/