通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位4 ?2 i6 S4 \9 a7 A# I+ F9 W
) M: M6 j* O: n' S # D+ [" i3 w" t) ]) S
- s2 w8 ]" O" i0 Q; v下面将以查询mysql数据库当中user()的第一位为例:
2 |4 K+ y- a" m0 B! ]7 _6 N, J/ a4 x3 B; [- f, o; R
" `. z1 K, M# y1 E y& v7 b: _
& |4 o: f4 } B% j3 \$ p2 B" lps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1), r, @) i# Q q! I+ j/ m
% e; K. a. z, T, r ?; ?$ f
" S' O' t' e) l$ o1 H
: W: U$ P/ P d! ?& h& {4 w首先执行如下sql语句:
( l! f3 C; E& z9 Q% e1 o5 q* z; [/ ]/ B" Y$ o/ G
9 D# _$ o6 x. W# z. u2 c, |# ^9 |8 \' m
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;4 h' j: y' z: @6 h" u s+ w
& S5 [' H. y0 h' P
& w4 m5 w! b8 K$ a2 ~- j3 c$ H( }$ r% G5 F* M# V5 g
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
: t& [: s3 {$ K3 M! b! \/ G! @9 b6 M0 [! x9 T# a, T" e& f
/ B; S, u# U5 k4 t) H% J0 x3 N9 v+ x8 z7 N, j: d/ Y6 \
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
; \7 t: @4 F' G) U4 k- L
3 U& x/ k7 Q u2 `* q5 G0 e4 F
6 s' V1 a1 `, a0 a
' {% s1 O; w! k如果运算结果为1,说明第一位为0,不为1) x7 m& O7 B/ |
4 z: g! v3 C( |6 d; [8 z! X
) h6 O+ @% u: s: G w4 |. D3 x; p
8 @5 @$ S+ C: I+————————————–+* O0 ^! e0 H2 Q" j
1 x g! z @8 ~" ]
| (ascii((substr(user(),1,1))) >> 7)=0 |" ]" h: S: c* s, v2 T
+ S( q# m0 _4 o V
+————————————–+; C- H! _4 W9 B5 Q) p
" @9 S; B: i( N2 I| 1 |5 d3 M. [* t1 g: W7 @% x# y3 I
1 a7 m' j5 h% g1 K* a, ?/ J/ o, p
+————————————–+/ C. G/ W* L( N( Y
4 \$ H. B7 A& B% [4 R1 @
1 row in set (0.00 sec)7 l/ h) y- Y, a- \8 T3 N) u1 U
, Y) j* Q* \3 N$ P这样我们就确定这个8bit的ascii的第一位为04 h+ Y6 U2 s/ [ k" w c- {
0 i. Y5 G8 s$ s ( B/ L5 F8 E" _# z2 @2 b
+ ^0 ^% ^) }. I& s$ ]" z8 U
第二次我们来做6次右偏移来确定前两位1 m) E9 t" j4 {* b- y" G
A% t9 G. s' L# ^* `7 S4 a$ N. d . r4 V, @: h8 I( F+ @/ {8 `3 Z
3 ~3 K; m U) C3 u1 v* t: f5 ~+ `* z前两位可能是01或00,即依然可以与0做比较,, A! z; c( h/ X
4 n6 j4 A' [: ]7 o4 ~mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
: ^: _8 Z3 p: c0 @4 v" g3 |' d Q
% A- W& x% u* O# x4 c+————————————–+ A; a3 K" `- r3 e
# Q8 B- R6 F: [( M' j9 ]| (ascii((substr(user(),1,1))) >> 6)=0 |
' f; Q0 g+ Y$ q! g- d3 s
E( e& x/ s9 f8 n& j- I' X+————————————–+
8 P$ l* V6 a l8 E
& A! @5 n. ?# B1 d. @| 0 |
) q* c5 M7 _3 b! P3 y9 Y1 o7 ]4 k. m8 k9 w
+————————————–+' W5 x+ E3 c+ }
6 Q7 l5 u3 X% z" {7 H& L# h
1 row in set (0.00 sec)* o0 y# d( w+ n; p# W
4 \2 }% x. v0 `% ^- D9 c6 {
6 r: F! g3 V1 z4 A" b
" @$ t& f5 @$ F结果为0,即第二位为1
, {& B; O$ w0 `- u/ b6 b3 R1 S
2 _. q. u0 Z. Q6 n5 k) u2 n
% Z9 A! m4 F# u6 P! L& o3 s4 J9 o3 x+ ]) {$ q9 h
开始猜测前三位为010或011
: M+ ]& V/ m+ Y, F
* o# V' M; Y, m" s( ~
9 E5 _: l; |* H8 N0 [8 u
2 q2 g+ k+ A M8 c& d7 }: ?让我们看看010和011的ascii码是多少
( X5 Z* D& S! l( y1 u+ H
1 F8 V( z) m/ e. _% ~5 y6 n + C$ Z) R2 E# m
. S; G ~8 S/ ?/ f4 ^" D* u
分别查询select b’011′ select b’010′
" O+ t! U: j- S2 f5 L2 M+ t" J- v& O& h
1 E. E9 P9 U4 U$ `1 T( _9 \% W. r
6 s. ?2 \" \9 A# x5 \7 }获得结果 010 = 2 011 = 3
+ ]; f+ b) @/ V. f% f" [" B+ V
6 L4 G$ g3 _* h; I % s5 ^; S5 F) @
5 h7 Y! Y/ d3 G& H7 Q执行如下sql:) S; }# i3 ]' }/ }; y, L; |. R
# d% C& p* k U' }2 A- {
# n$ C# ] I& A6 q
1 w( O+ E2 N; F v; H
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
1 G2 x5 h+ t+ \* z3 p5 f$ {) G3 Z5 ]: _ }8 Q" N
+————————————–+! z! L# _1 J5 L$ p4 G/ y( E
7 P- Q7 n! v9 p! |: w4 q4 V| (ascii((substr(user(),1,1))) >> 5)=2 |
) }; Y% @$ V! m; p# @+ K0 c3 @' I# \2 L2 M& h) }* w4 q- `
+————————————–+
+ R* Q- X5 M4 O6 R9 h; h2 o {+ l
| 0 |
, t t7 v! {& ?( B
9 y5 R8 K# C: j) K h8 t+————————————–+
) \5 w6 f& j( n% ^1 ^
5 k8 S% W+ Y# o. Z* }即前三位不为010,而是011
: w& U U7 Q: O' W( g$ ^$ B8 | E) Y& ~( R, o/ R& q! ?" A% S
4 H; n' _, I. {( P% h. ]$ ~ a
5 b6 v1 s2 }8 x# _) S( z* ~直到获得最后一位
. ?" V$ N* N' F# j/ n( A) C i
) j& _" T/ Y/ h: a/ ~ : Q( L m3 x0 U/ R0 E/ I. \. e
& W5 [+ B6 ~* e- W$ _) \( K7 a8 g
最终结果为:011100102 Z: `# e" y( s1 w- r
4 _2 j2 ^5 o4 P, {6 \
Z! t4 M( x; I2 m! n" r
4 x; Q1 a7 R) Y. O转换一下:
3 w( T. L \3 `) y" _) J
5 D) ~. g' X1 c7 M! T# X) `3 g3 }
5 O! \" r' h( _* @3 t, n, J3 b
8 p6 @ g! }. wselect b’01110010′
# s" j* }1 ]- n4 e- t3 T+ K. ?" ^2 @ @9 g9 d8 B
$ H) \8 z5 H: }
: n7 f6 s6 f t查询结果" c& a/ o, j& a! b# o& {
1 J" S& j; o4 h0 Z
2 C; G: j4 Y( M1 S( H
! n8 H+ v" x: }# W1 a
+————-+: {3 n q: Z. g6 ~; b: P2 ]
* [4 ~, G1 j7 R& p8 F9 s| b’01110010′ |' o/ K+ W6 P$ B1 e7 ^
5 w/ I$ {) t- q" h" Y0 L% Q
+————-+ L2 J* _6 V8 o/ |9 q
9 @9 |% p' R6 k0 D" f; O, C2 g+ _: t| r |
8 O5 D6 ?; {9 Y1 Q8 m/ e2 n3 `) @( q& Y# F2 t7 G* G
+————-+
1 B1 G5 w; `! [. G, q' _1 m
9 G* |; t% X6 q. w- [, O1 row in set (0.00 sec)& ^/ k( g0 l4 o
# T8 t! K$ e7 t( g. x ! T. z1 t8 s8 o5 H9 X M" t
3 Y [/ K. L9 V/ K
这样我们就获得了user()的第一位.其它位依此类推
; `. p6 v; H: V4 ?/ ^4 [
. l8 V) g2 P9 O; @; L+ @- E |