通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
% W' Y# W+ q: W
5 k% [5 l, [/ M$ V" k 2 G1 J6 J, H* @2 D, z4 ]
# ~$ @1 N1 p4 q! l5 G下面将以查询mysql数据库当中user()的第一位为例:
2 L* V! v: ~3 l5 V# a- L: _+ [! M( K& D& v4 p7 q; X
' y# V, z$ e; k: N( y3 I' u$ U' l# B* V( l+ P( c" q) P, b( k& e; M
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
' d7 E5 s$ x$ B$ K/ W% }0 c* G6 J# D' q+ A, y7 b9 X- x4 X: C
. g; m6 ]( z3 E7 h
$ y3 g8 F1 q! ~5 L2 }7 i1 [首先执行如下sql语句:% E, b4 R, ^" ~; {+ H! B" w; S
) c. F) N7 ~* ?
: X% B) G* M0 U1 l( G' _$ n) A m
4 x* n1 D- w U! Rmysql> select (ascii((substr(user(),1,1))) >> 7)=0; r% S2 K; F. O
& D" Y& t0 W; D4 j6 p; C
1 w# d f. }$ W& C$ X. T7 b: Z" D9 P1 S2 ]6 @
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
6 I7 Q7 L- Y6 r! u' _% H. e, E' R4 g6 k: k. P ~
" o4 X1 q- @& N. r9 r4 F! d
7 g3 z# a+ ~/ d. j7 [8 W9 P9 ^/ m4 p
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
0 K( P& y5 u# ~9 [% o: V) y- p" H1 }* [* t
% z9 M: }' e/ U/ S
4 @+ h( W, ^2 C/ _' a5 O: S) Q如果运算结果为1,说明第一位为0,不为1
* d3 o+ e- h( V
! [, a$ I& j: P7 d7 N* e 7 F6 F! f) ~% j; |
3 B6 i3 P# I2 R* Q" Z8 I- @8 g% A+————————————–+
7 ]- O2 e% e; B b+ _
& R) k9 ] C/ ^% p| (ascii((substr(user(),1,1))) >> 7)=0 |6 b/ q$ a% T5 o% S Q, |# R1 q# c
% C4 P$ V5 K% n/ D9 u9 j
+————————————–+
* ~$ i6 v6 h& K: L1 ]2 e
) V. e# p! k" \7 F ]1 {5 ]2 v2 j: v| 1 |
6 s( }& G, |3 j1 @; o: S6 ^ A3 V- J7 H% `
+————————————–+" |, ~3 L# u5 u- K. f
; k7 j6 o8 q! F" O! x/ s
1 row in set (0.00 sec). P0 f5 ^1 R5 q5 v
9 `. p& r5 l- i% V* m9 P这样我们就确定这个8bit的ascii的第一位为01 r, _8 K+ |# o E: e$ b1 p
+ Q* q# t) ~6 l" x6 L3 e* ?
! x# z- }- a% M3 w8 \2 c5 w
% x! Y& Z I0 d第二次我们来做6次右偏移来确定前两位: c$ {! E ], u$ {$ d, ^
' P3 G) H, J* I1 \ ' v# |- e4 w) b3 x
- Q5 r& w# g3 ~' B. F% G前两位可能是01或00,即依然可以与0做比较,
* [7 ?6 s2 V$ m4 S
4 J- K# y5 K: a: t% ]mysql> select (ascii((substr(user(),1,1))) >> 6)=0;( X- K r" O( L% Z! y g2 E
- J, V' g" u1 C8 _6 k. l
+————————————–+! ^$ Y5 H) y- V: j
$ s3 G6 {& C$ Y5 ]. m' Z0 k
| (ascii((substr(user(),1,1))) >> 6)=0 |
7 i/ s: U8 v1 v; D4 I9 {( C: O7 Y, b) v+ C5 N
+————————————–+
" q& g4 w* @( q5 q0 f+ Z
. O! M Q- G$ t0 ?| 0 |
' v1 [# C2 B& o# E+ ?
1 c$ Q9 P$ s+ W! M. b5 V+————————————–++ W) Q, f& D+ @
" F1 _3 R8 c) W" h0 Q! D
1 row in set (0.00 sec)7 |5 P4 ^- `8 H" G1 q
$ E* D2 U. ~6 n# o
' q! B- o% Z1 h; Q$ t# S' Y/ H% b6 a; n# h0 y; N# t+ g
结果为0,即第二位为12 F6 n# S& \* S" V
9 ^* B9 _+ R# S) ^- u7 X: g4 t* U # n2 c0 Z1 s3 x! z: I7 q$ }; f! h) u" w7 Q
8 S, `( r: N+ d* m: Q, r! a开始猜测前三位为010或011
4 [+ E! K5 F9 Q) E( Z
' y1 K6 N9 k# R. C& {6 B# @
1 ?4 Y0 g5 j ]! Y# ], r0 o
: m1 E7 E9 @, O j8 T' B/ I让我们看看010和011的ascii码是多少3 y. C' p, \/ y: q3 F
9 M/ C/ a* C: d$ u0 Q1 H
2 F1 t7 R. V8 m, v1 c
- U9 g8 a6 E p+ Z, S
分别查询select b’011′ select b’010′5 v8 z' I% ]1 Y7 e3 d* y0 D5 X
. E) C1 e$ y$ ?! }$ K( j8 f
$ p: r" O0 W$ K' X1 X- W- B) }. @0 e& ~0 Z
获得结果 010 = 2 011 = 3
# o3 p! [. W% z/ o# Z$ S
+ F7 F* a, h) b9 P" i& A: C2 J
$ @; d; h7 d8 c! ^
s% W$ q8 N5 G执行如下sql:6 j0 Y" j ?$ X. q# a
! _5 K" c% B2 r) x) ~# B8 ^% x @ 1 ]) b+ x# _9 _( q* n- t7 L( f1 R/ H/ Q
8 ?% s% U" w$ f# r
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
- k/ ], j1 x" V1 H; I5 q% L6 I9 Y" L7 P# _4 B: D
+————————————–+
" y! K- U8 B- C, u/ r+ Y: V0 P
( O& G* ^0 R7 h0 y: j| (ascii((substr(user(),1,1))) >> 5)=2 |# a; E6 U/ L% k* @; G, {0 n; t
0 E7 z( }9 r3 E+————————————–+5 f' j. Y. k) I( a2 ~/ z
* L+ M% L- _6 T) q
| 0 |
& \! U/ `/ T v$ Z% o+ y4 P2 N6 l2 z% w( n) W; L5 J
+————————————–+
( ?: `) v& p4 o* X- M- B7 {; Z0 a
即前三位不为010,而是0115 g. [! o, u' t- s2 o5 m
7 |, P- {5 F- U
3 r. @ X7 v% A! e$ E7 x* E1 f+ w ?+ b5 T. Z5 E
直到获得最后一位9 z4 b `/ j: o
9 e/ _$ ?% S0 _" ?! \ & r. H$ x4 d! l" E9 b. ^
" C: n" v( K9 o8 W- k最终结果为:01110010+ R# [) P" [+ `! |" @. e
" A; O9 M5 X! Q3 k* x$ p+ G: r
5 M# K$ \, I; V+ I& c ~$ j7 a( {* @
转换一下:. |* v5 E5 L, z! H7 e1 z* i
# ]& N5 n7 H' S
8 u. R, P2 z* Y9 Y. v R% t a+ b
5 h' b0 |) {8 w" I! o
select b’01110010′
- r9 R- m3 w" ~1 A- P/ o
& c! n/ h" _# g" i * c3 |. B! E) d% f/ X9 S5 m
) V, Y& H5 H# L5 R3 @. Q$ [
查询结果2 V+ g! C' v& \+ `2 u z
# x2 J8 ~- K1 v3 E* o; W ' H4 x4 g+ O& ` s* G* M* A
. c2 B4 E. i8 c7 z) F% K, z' a: ?+————-+
3 S( e0 F4 \$ U" e0 g2 m# u z+ t0 ^' y& |0 c8 @8 l& ]
| b’01110010′ |
5 E! D% j' p0 p2 E
7 }% A# P6 D' Z; @' S: J+————-+3 A: Y4 L# S' b) F. e! S2 Y
9 j1 v! K6 z0 s$ t9 A| r |
0 G% U/ F0 ` k) \! T% k
2 W, w- X) T! B5 B3 `+————-+) H0 J2 O# H0 D
7 h. n# q6 `% ^" W! R) t% Z' m
1 row in set (0.00 sec)' C( B+ D1 Z' |8 R' y% `2 s( T
{& M" |7 |: \/ u- X( s2 S
: K. W* _7 w1 s/ j) M% {; p8 N, l1 t$ R5 v0 F
这样我们就获得了user()的第一位.其它位依此类推& X) G$ u+ h* ~$ k' H, v; O+ q8 W$ u- R
I% f3 O0 `" f7 I6 g |