通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
4 O, ~$ K5 u0 ^1 P) |8 l) M
! [- J; _, z$ b$ M$ P7 K $ b" l1 N. [7 Z. d P
; i, ~0 _4 M& y& n' k
下面将以查询mysql数据库当中user()的第一位为例:
- }' i$ ^( D8 K+ ]. R5 w6 f; P" I/ k
% \: w7 Q; g" t0 k) @: p
! b; ~5 ]4 D' J! }, hps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)6 f/ e) |0 A3 c% t8 S! N0 v$ a
* G: P' ?0 f6 X- Y4 k1 t0 V2 I
4 K- A5 e3 B# k x, A& k: O4 t( x9 e+ z
2 ?0 n0 C) g( L" d/ K首先执行如下sql语句:
- Q5 x4 T9 T; d, [( q# A+ _
% X: l- P1 u9 c; W6 e: @
" j; n. M& f5 r% Z5 R$ L4 p9 Z) H$ b' q* g1 r- [" O: M! Q) m* P, c/ G2 e+ {- c
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
+ G: R1 x. e7 Y2 x+ `6 X
R7 K7 ~* e o }; ^& E( u2 W' { + }* {* u/ F2 ], y% k, X
8 D- b, f; P2 j
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
5 o! i0 G. d- \) D2 q f* S: R* p0 g% a2 N
9 s L) G; f& o; B6 v6 G% x0 s
" T4 T5 Z( Q6 X4 }第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1- Z3 _5 h/ N' E: h
2 E D1 A& A r0 x: `: \$ H$ G
9 H5 m( A! j* M/ o" l- K: b* \6 {1 g# q2 O
7 U5 Z7 f( J) B如果运算结果为1,说明第一位为0,不为14 }+ O5 T' ?6 w
8 K( a0 R$ k9 q' R$ I $ i' Q$ ]! E9 k6 x
6 c) W0 {* D$ S$ E/ D4 Q w+————————————–+
O) W) }' Q4 [4 c$ }: e; U: Z/ S; H
| (ascii((substr(user(),1,1))) >> 7)=0 |6 ~ G! J( b6 Y( k5 ^7 J3 n
. \4 x H: u- a) x; T; _1 v& x
+————————————–+! \9 H1 A r r4 S- f" }
) H9 t1 V: ~/ ^) w4 y; T6 B* [7 o
| 1 |
6 I& r$ B6 V3 G5 ^2 X2 @" r: Q% f9 X( K: [. W) R
+————————————–+% @' q- L" E1 R7 j4 Y1 c
) y! a6 t* O" K4 F5 W
1 row in set (0.00 sec)
7 O% e, `) D5 m9 }% P: c' [) V3 l3 _, D4 H- M
这样我们就确定这个8bit的ascii的第一位为0
/ ^+ b% W0 [# g! d' Y0 b" K
- S7 d/ D- Y+ f0 o3 E- W
# g( x2 c" j) u/ T) e* `* ^. O' y! L' m! C+ j: \
第二次我们来做6次右偏移来确定前两位
3 }( B8 I+ D ?+ U; }; I# S+ `
# k& P! `3 s0 K3 | N) Y: n 8 T6 \0 X9 c+ v0 L1 @) `2 U5 C
. N: B5 \, _ E( N4 w
前两位可能是01或00,即依然可以与0做比较,7 S' V1 z0 h$ h) G
: ~" K3 j+ b1 a: c, omysql> select (ascii((substr(user(),1,1))) >> 6)=0;3 Y/ N: ~7 p7 X0 r% o( V
6 X" ~) |+ ~) A+————————————–+' m8 I4 d8 ? u& P) B
" A/ s; e& _* x3 N& y8 u7 d
| (ascii((substr(user(),1,1))) >> 6)=0 |
' }7 i$ R! i' H! T+ r. j0 _6 b. H6 K+ Y: F. M
+————————————–+
! t# D3 a! o7 N' v p+ E( K* Q c! B, x, u
| 0 |
( v+ F3 n# R3 B' K( E0 u- X( M W1 ~& z
+————————————–+- f+ \" I/ `. \! n
- `* K/ R0 x) a X8 P+ h* }9 r
1 row in set (0.00 sec): W9 |# {( Z3 d/ \- f9 V. G! C x
& e- g/ i) K. ?, m1 Q. S- G
9 z+ p) H, V* ?# Y1 W
C7 }. U5 ~! O+ c9 {! h6 v结果为0,即第二位为1+ h6 |4 o) W |% o) K1 K
, I) _) Q5 |% g9 |3 K- `: f
5 `; j. x" \2 W2 R" z; r1 }
. ]1 v7 V4 B* R8 d3 N+ H* M开始猜测前三位为010或011
- K' `+ m# }) N$ N
' b2 m0 R% s; \1 E0 T 9 y6 p& \$ ^: s" m
9 J! Z& c0 Z$ L' s( l+ ]让我们看看010和011的ascii码是多少- s a W6 z2 n5 c n
0 q. Y: ]2 Y4 e# \3 N
5 J, o( l, E+ H2 S; T" M, h1 W* D% F( |7 Y( x0 S
分别查询select b’011′ select b’010′
- N. u& T% `# o7 m( @+ M; ]- {. [2 M. m2 ?9 y
. a( s3 n* x1 s* v( ^
% v* I. b' f* D/ d" I: q0 h获得结果 010 = 2 011 = 30 y9 a% D& f' A5 [& |
) c) q/ ^- }; n$ s ) R! f$ E% B; b
* g! h! Z7 J0 P2 l, p执行如下sql:( k- C% e9 Q8 F. _4 @9 S
+ C$ I* \- ?4 o1 d$ G. {0 U! O
& [$ M3 s& w! |% d* e* W) K' O2 \/ l- Y! ^" s z1 O: X9 ?
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
+ |8 E. k& J% N/ b, j8 a" H% ^4 v; s6 X7 V0 k& I2 Z. S! `
+————————————–+
% v7 L) s% R) P1 T1 B; ~2 ? {, n% M; W- V
| (ascii((substr(user(),1,1))) >> 5)=2 |
, | G$ D$ m7 i3 t7 l' ^) l( n1 t5 U+ ~1 w/ s( U6 L" K
+————————————–+. w% Q' ?; ?- T# F+ w
3 `+ W2 Z4 a4 m0 i; ^| 0 |0 `+ _' R% V" Z0 D/ Q' U6 @6 u
" U# G- P- X' G6 g6 z2 W) C9 z+————————————–+5 r/ p& w2 Z7 `, c) m$ {- u1 }8 {) K z
* P$ K ]8 S% v即前三位不为010,而是011
# v! ^/ B s+ S2 G+ Z( b9 z2 X9 h4 B& h2 _4 O- c! k R
" U0 l# Z0 C v" y4 Q% G8 k8 x5 a. `0 J6 ^2 t* o: R
直到获得最后一位" W, O& e0 F8 r& N/ f
" W6 j# u, t' C 4 v1 u: c$ [. G
5 w2 F# O; J' P% ]* K9 ]% |
最终结果为:01110010
* k3 D9 f2 a; T( X& r: J- U( p; e
h2 E: P: d$ P; D: l1 @" `" ^+ ]
: z' P9 `9 [* r& P# i* m5 z0 k! C% H G {7 C4 L0 z
转换一下:
, d- D9 N$ w/ `. ?
8 P. a8 s1 R! a" L
6 r' W! W, R6 h4 b' ]
) V \ S* J3 H) |select b’01110010′
$ u1 t% m' p, ~% P; _% a h; d* q' }6 \1 Q6 A7 _/ l; c, e- D
8 D! z) p5 s- i6 n) r3 O' v: }" P6 C& Z. M5 E2 U6 r* r2 K
查询结果
8 z+ A: s' a8 J2 C3 P# j
0 ^5 |, v8 b) } h( t
7 C9 t0 p" x: r" w* _ P6 T/ i# n1 G& o% @% w2 O: P
+————-+
3 U7 F) B9 Z' h- @
% X- a- ]/ D: o| b’01110010′ |0 L# A- a7 X! H+ |
' U1 h- q' n( f, l; N7 ~3 L. `5 r
+————-+- t# f8 D" v6 [/ x- v# g
' w5 |% O+ O5 \2 v' x8 v
| r |% Y: \9 c' M; ?! H' n( V
; s- k3 u6 |3 W7 @
+————-+
( ?4 y# S2 D9 x5 Q
7 t6 I) b( V+ q+ W$ q1 row in set (0.00 sec)
D; L! `+ N1 V. C6 N! x6 G) ]) p# z* K2 [5 F) Z' q+ i4 l q( |+ h
' n. V; p ?/ m) u7 _1 }& W4 ?7 n7 E4 \ @% S: v
这样我们就获得了user()的第一位.其它位依此类推 ~% j0 R$ y- W6 u
) l1 L1 J; ]' h* i/ s* P& | |