通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位+ P7 V0 t5 e, i) e* |
' {' E( E$ q3 O9 H- J1 r. E- S
2 q' V7 K3 e/ t m" ] [" d h: X6 C8 h
下面将以查询mysql数据库当中user()的第一位为例:
8 x6 D9 m) l K' P9 |" I" T* w
4 f7 H6 b8 c; Y, K ! ~9 {3 Q/ q/ a T
% M! G; U1 w$ y) Aps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)8 D$ j+ d: R, ~4 T+ P' h, I. ]
, F& @# h, M/ z0 B3 ]& R% q5 p5 A( u
0 D2 k( [! Z' ~# l1 X
6 Z8 e: N0 ^ u首先执行如下sql语句:
* U1 \2 |1 C9 f1 |4 E
7 O6 y6 R- R+ c4 I! @9 } ! ^! o- W( _* z: E" h+ R1 H0 c
* E; v& I: J/ ~' `* o6 c
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;) S5 W# M, P/ J
7 [# A- E4 R+ Y, z7 @5 C$ y/ q2 U
% m9 x/ Y& V' v
- Q. ? s2 x5 s& }我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的0 n* k4 C, T' K" d; I; g$ Y1 b
4 Q7 E/ F5 T6 V( o+ g& J: G0 f: l$ M K * a, t9 {6 j) M- K6 ~6 g
. R" c* y5 ?% b- h
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1% T9 W+ m$ h3 z, D, f x
6 q- Y" R0 q( ~) `
* W' i. X8 O( r6 d: o1 ^% l0 H, G! w$ W7 w* b9 n% j
如果运算结果为1,说明第一位为0,不为1
; t$ \8 |- k, n1 m# o9 ]( E6 Y: u% D
- C! W& \7 N; A' m
; Q) ]3 `3 Q5 r, T& b. B2 i7 D3 b4 A* P+————————————–+
. M8 R1 r' p2 l$ r: R0 ` `: r# |+ X
| (ascii((substr(user(),1,1))) >> 7)=0 |
2 j, P- H7 w8 i+ G. p2 e; e
# r3 e. o5 x$ }+————————————–+
1 I' W5 e) x" T) X6 }: g$ X$ K$ W- e" g u8 B9 s6 z
| 1 |
$ A7 V, s5 h; Z V# P4 y7 Q5 I: G! k# g; o2 S+ V9 @ h
+————————————–+3 u( N$ l+ y5 @+ w
7 x$ N7 I) G- f+ `* @% ]* a1 row in set (0.00 sec)
$ I* M# S8 S' r8 v/ V& c( n9 h) y! D s9 u1 A+ A
这样我们就确定这个8bit的ascii的第一位为0
9 q' ?$ Q: t5 x4 y$ ?9 J( [9 ?) J
7 F2 N: c! w0 U' {; o* q! k' G, m x z; T0 y
第二次我们来做6次右偏移来确定前两位2 Q" v# H `, }3 B
' B$ L, j% x( G; G) |. x2 B& h
# T( m) k- a. v( r
1 n$ y; O. A9 _" J' ?
前两位可能是01或00,即依然可以与0做比较,, r: y- D H8 O$ _, g* D+ u2 I! ^- P/ H
/ _* Q" h/ q9 r! F3 ?
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;# j, t. _9 Y8 z* s9 d
, A" v/ L' ~1 \& F! F& F" q+————————————–+
! [2 E$ N5 l! B' X4 x7 ~) b
8 a' l. E( G% G: f| (ascii((substr(user(),1,1))) >> 6)=0 |$ t, E' d, \: R* h
6 x5 P4 K( n) w. x* h7 q9 U/ B
+————————————–+: C ^1 @6 @/ V6 D' t8 t
. C( E w! f& c7 _5 ]1 L* H, |* e! E
| 0 |# X/ t' Y; u. u# q0 y) ]+ d- e
8 H$ H! Q. ?6 J$ J8 B, l+————————————–+& D( H7 p) Z) M% q1 z: C
: @ G% T# D7 c ~1 row in set (0.00 sec)% a3 \% l/ E% _* F9 ~' c
; u9 J; S8 M* f) ~. b- w- z2 t9 b " l6 ^* z3 c, W' O" }7 v3 s' x
+ X( m! s( d }1 K; [0 T
结果为0,即第二位为1
4 U1 M8 F' B: S5 c1 H" ^/ K3 @2 u; u" @( P& S; b L2 l
% |+ M4 v& V7 q4 Z1 m8 _4 |. q$ `( s; N) P1 @$ ]5 J
开始猜测前三位为010或011
9 x( O' D! I- @- i3 a7 w: Z
3 d7 e& W7 V6 G4 |
. i3 w5 E0 M6 y. Q9 W# |% x& v; Z3 ~8 s+ B5 `1 ?% c" K8 }
让我们看看010和011的ascii码是多少
2 d& Z8 y) b! s" O2 W: k% S3 T. g6 a& E
, Q# x% B/ m' r; a( L, p. g
W Z; b7 T. Q# g& f7 L! a分别查询select b’011′ select b’010′+ T9 U( @7 j1 a1 z% X
8 R+ ]5 ~7 o t9 O0 D6 a5 N/ F$ F
. z) ?3 ?. W2 y+ j6 M- g" g( n! p& ^7 U" ]; G
获得结果 010 = 2 011 = 3- r7 [) g0 N5 ?+ }7 ~
7 E3 Z. J- F8 P
* u5 \) S: p0 n0 s5 F6 n( u
8 ?. z: E7 F7 G执行如下sql:
% C' Q1 `" r# U4 a. u/ R& Z7 l8 n) x/ `, d% A: s: f
* Z; Y4 x2 k. \9 L6 y2 Q
1 @( N4 r+ E+ K' u( ^0 S9 b2 |mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
4 ~5 {4 Q* ]/ Z1 N( P( [
* G0 p+ C5 g, R# @0 f- x: k& d+————————————–+
; W) f; C6 s0 G/ X; F) e$ D0 w6 P% n7 K2 E. E6 Q: l
| (ascii((substr(user(),1,1))) >> 5)=2 |
A& g/ ^- H/ s3 Q" X) c7 Z1 @& J @2 o) A
+————————————–+
" I# y. L! ~( s
0 ~ X1 X- m' ^2 \| 0 |
5 u8 g/ {6 x% } J" W& ]. n. V
( L F5 B2 o' y. D) e C) C- ~+————————————–+
! @2 e! m# |2 P2 [
5 B# ^% B7 Y) r1 u! L' r* b) U即前三位不为010,而是011
9 M/ [$ r% T* b+ u0 O2 Y' X/ q, \5 v3 _" m+ l \9 u
4 N2 w7 `6 q/ ~" f# R: P h1 P( b7 ?
/ X! d' Z: f$ Y5 A/ ?直到获得最后一位
! [3 y" _2 I& [" |' u
" j; R! s& `$ k) L. d0 f 6 p, t5 j: c( r2 }
6 G+ Y0 f2 b' X! F/ D最终结果为:01110010
2 k8 O6 b6 ?# R5 E1 k% P) \2 _2 G; |0 |" i' T
, |1 R5 ]3 u r# ]/ i0 e
- X9 [$ b v- X, N. f0 e4 G7 C
转换一下:
, U' L, E' H6 g% u( I+ k5 r) |( q/ \! X$ z+ H; l; d' b, F+ O, ~
9 ?6 }- V6 U' X3 X4 L# T- \4 k( t9 {. i, ?
select b’01110010′
7 ?8 F& P q S- e- ^9 f1 G( `1 g3 Z
; k& {8 X/ U8 y. z. u$ A- k
3 U& N: M0 H- C3 [7 T- P查询结果
, Y, t- Z' R$ M, a8 k8 Z
" B4 Y% b c% M+ N! E& L$ X' _6 X 3 ]# G/ [! T5 {/ W% G5 |
$ ^$ j+ D8 X" x* k7 ^* ~
+————-+
3 s3 B% A% w7 Z( Z" f* T5 A& K; t/ a7 x' [9 y
| b’01110010′ | f4 L0 Y3 L* x
* q6 ]2 X5 k* `+ _5 Z) s) |) H
+————-+7 M: B- `# a# ^' A3 L
1 d4 l0 I/ I2 i% s' E+ n
| r |
5 ~2 E$ S0 p0 e( t! f+ ^! M! W/ h9 w+ R* t
+————-+" \' L( ^' |& @6 r" D
" l' G3 q; Y7 n) c
1 row in set (0.00 sec)
5 a( E' _9 w3 s, }# y6 O' g$ i/ ]4 i0 M( e: z# U
. F" `6 ]+ z$ Y. p6 l6 v
2 ` r8 O; _5 G# b* B这样我们就获得了user()的第一位.其它位依此类推$ `/ Z: M2 E. B5 b9 E
3 A9 v- a2 S: {$ F( L% z
|