通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位+ C$ C0 O+ p9 J6 ^4 T6 @
N5 T6 h5 J: n0 }6 |7 V 3 x! {+ |; J5 q
2 T7 l5 }- J: m1 n下面将以查询mysql数据库当中user()的第一位为例:
+ v6 i# C0 @2 v/ }; A$ x! s* C: m1 A- v5 y9 C8 W4 ?% s# K. f/ e8 h
. C+ _& m3 A! Y
6 r/ Y' w$ H L, `. Zps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1): y* u' Z7 M4 N; I- H3 S
8 a! w! J' O8 t# ]( N) I
2 g6 p8 T8 r! E6 G3 R3 Z* I3 `2 A# t+ m8 ?
首先执行如下sql语句:# C1 T; f; y8 K* G2 K7 N
7 {7 g- ]3 r4 K" c5 r! \
& G9 I8 O9 M+ j
, G) L, U+ b% x, }* Nmysql> select (ascii((substr(user(),1,1))) >> 7)=0;- [7 J4 ? w7 G D
3 G2 A9 F3 x* |7 `
& [, {: @% }# ^* _& E% x4 X
- X! t: H( Q# |/ G# W2 j: |我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的4 e/ |7 m1 G! y r2 i/ J$ [8 H5 w0 ^
# a. e0 z) x% q; e% O- |' d& E 2 b: C7 b" L3 p4 l. K7 ?- ^
) o |" |, k+ T% A' a$ {1 ]第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
$ Q1 `6 Z: _* _) e7 j4 z8 ~( B1 U' D! F+ J
2 [- b4 w1 s. c( o
- M& T8 h+ [! Q8 j: @1 ~2 z如果运算结果为1,说明第一位为0,不为15 Q `. c( U- ^! i! y& j+ u
# i1 t, u% m5 R! K7 c5 t5 t0 c6 \$ {# e
% ?) ]* d6 i4 |) C
, B8 u2 [0 C, S K9 E/ d+ o+————————————–+6 U+ x6 p' U4 N' n w
) B8 ~, C9 q4 T8 f/ E4 l, u! K
| (ascii((substr(user(),1,1))) >> 7)=0 |1 ?7 l" W4 P/ i# F2 G
4 g% L" J1 S9 s! l! A+————————————–+
! W! H: a( \; U) j J
6 r; u j. d5 ?- c3 p5 F0 [| 1 |' j- S( G d, j- K# r1 y4 s
q. D3 q# B5 S4 t3 X1 b$ Y1 V+————————————–+# H, R5 Z3 @, H1 i2 y8 C$ y% v" W
5 o8 F0 v1 Z8 n9 f- G/ B1 row in set (0.00 sec)
2 k" k& x& `" t" w3 U; ?, t: R/ ?
% o# x7 Z3 T+ [( Y% W1 c这样我们就确定这个8bit的ascii的第一位为0
+ M( J: V- ^. C) o, x' S. \' N. C% |6 ?( Q: k
# _" h, q& l: p: `( @4 g3 o2 ~: O) b+ E1 x( E" o3 I; ?7 F$ z4 U
第二次我们来做6次右偏移来确定前两位" O+ b. D5 [1 F) _' i) G
3 j' O4 A% L/ N$ x3 a- I( |
( b, @5 K f/ a4 r0 n/ m
: F# H) G# L3 o; l! u" B2 N
前两位可能是01或00,即依然可以与0做比较,
8 @) ?# Y9 V3 W2 P3 N
. B1 o) ?: i7 imysql> select (ascii((substr(user(),1,1))) >> 6)=0;
i! K# d0 P. z2 E" l$ [- [9 b: N( E; x" G+ o% m3 H$ U7 G- c- ~
+————————————–+* B- [5 J* D- e' Z: S% F
' w' n# S0 o' B% h, Z| (ascii((substr(user(),1,1))) >> 6)=0 |; T6 k7 J: M3 d+ [( c5 u
8 s& B0 Q+ g1 ^- `# C2 D+————————————–+. f! ~+ {- k! w$ g _
* Q! y- @) D& g. Z; T) E3 ~+ `| 0 |+ V4 b' P/ V* c* N- @) \) r9 G, }
0 M' L& _- E5 I7 a) E% }
+————————————–+2 v1 @6 [% M9 n a( G
5 ~( w; f6 K* M+ l% p1 row in set (0.00 sec)- L j; O* H/ ~7 D! N0 @- U
( ~3 z4 y" h0 S; u. J
+ l3 w1 P4 l+ R5 h7 Q/ B Y& J, |% A0 Q- t, C8 ?
结果为0,即第二位为10 v3 o4 s& R8 ?7 _ i9 l
- l6 u* _6 h8 b" G3 v. R
- R4 N: z8 ~' t/ d) U+ ~ V. h o
, o4 J8 M% ?7 `9 ^; W6 U开始猜测前三位为010或011* w) f6 A# K# A1 _/ N2 N3 p
! ^1 z+ e# F5 V& A/ R* K # R4 `; U: X! `$ `, y2 [
0 ~' A& |2 \, L让我们看看010和011的ascii码是多少. U* m0 u8 X# m: I; J+ p
n' y+ D. Y; M$ l
! a: `" s" w# F* e& m5 y( w
( G. m& w. S- O( v% r' H: r2 E
分别查询select b’011′ select b’010′
4 z- O/ ]4 w; l
# ]5 u7 f- _! ^ S2 g% m( {
f- p6 k5 n2 i: X7 ]. |* N3 g" I% k$ m& D3 }% O3 N7 B6 `
获得结果 010 = 2 011 = 3
2 s2 ]5 D* D# |2 n7 B; Q& t& t9 t1 T5 A4 {+ x' u5 M, D0 ?3 V, P- a' @3 f
1 ~) B( g, B8 H4 ?, H% ~) e
& i$ ^% K0 r( T& e$ z- \! M执行如下sql:
$ L1 P, Z6 ]0 V3 E* ?: ^3 t; v
7 b, t; }! r% l# l7 z
3 f. r/ V0 j5 I8 o, n2 N8 E& K/ V; B+ E
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
% A; R( x$ H6 Q" G* m! { M) j( c/ Y; r' v' a6 K6 {
+————————————–+
1 v9 l2 m3 ]% {: s( z6 u6 i' z' x$ Z% r8 d$ d& B& Y! I
| (ascii((substr(user(),1,1))) >> 5)=2 |* T% b! D S. |) j
: A# p# d7 _$ a- U) ?' h: F7 p( }! [+————————————–+( K- q, Y9 e9 [/ D' X
, p7 Y6 q& Y9 S x, x| 0 |
6 x. _, ?, o' M+ v. S
0 q# H9 i/ i I+————————————–+" M8 s; m+ e3 ?0 D
3 e0 }2 i0 _# g( [9 ?7 L
即前三位不为010,而是011
9 f% V9 r! `1 B5 V" O2 E6 f8 v3 P" h) ^' [- b6 g7 C7 Y
1 B* u# ]: L5 p+ `! |" Y% \. I6 i" x
直到获得最后一位
4 T) R9 D6 k. W5 t7 i5 y4 l y/ B) Z6 y4 {
# I; q* m5 s" Z- R3 Y+ q
: B) P- G, z8 F! I7 W9 b: I5 R最终结果为:01110010* q9 ?. |' A2 i- k5 \6 A( M
( e9 x1 a1 ?6 M! j) S5 w
% k a9 A# y6 g: v7 z: p
- j3 i6 [2 Q# f, A* @- m转换一下:
) w V5 v( D0 P9 J/ F' o% g4 u3 ^/ c% e& ^; `
! p, p8 j8 c- j! T6 U3 l6 E
7 X8 }: ?' i; _0 yselect b’01110010′
4 T# h6 Z1 B2 P% L0 w
; P0 `% o: Z8 A' E; ]- C$ ~4 E
) E; \4 {, i& ^ |) T, @4 |( N$ d( e. q, j9 ^; I0 H* U+ @
查询结果
8 Y4 d; x- B1 T# C$ M& e$ j4 T: G2 N) }! K2 s
4 b; p* g4 U1 ?% r! H
( v6 P& D. |& c, n# J
+————-+& [9 w! W: w- y' f: _0 j/ \
+ N! [1 P4 A1 X& B2 E5 I; g! p| b’01110010′ |$ L1 ~1 w8 i/ q( h+ B+ R' n
5 c+ ~4 L5 P+ a w+————-+
; t/ ]3 _3 M! M$ z6 q+ A6 g' k
, ]' G4 }0 k6 V$ [5 _) n| r |( ?4 U0 |# T5 A _. c( `
0 G2 R2 o# E9 p' e$ w# R+————-+
, O m6 ~" v7 A1 G. W. s4 @* j) s' z* W+ K, [% ?
1 row in set (0.00 sec)1 U* D( m3 \3 }* s: C
, S& P5 A- U6 X/ B) p
, T2 m+ _* ?+ Q6 b
- Y+ X, V0 n$ ^9 G) p$ E这样我们就获得了user()的第一位.其它位依此类推
& z; ^% e) A6 f; V6 C8 L
+ w8 h1 X Q0 Z; T5 N |