通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位( I( ?) a: k4 z* M, U% O
. X1 v' p' [0 V' n! _
) x& l& D0 z) b: m d
1 V: c7 e6 U7 w3 L下面将以查询mysql数据库当中user()的第一位为例: _' W, E% j: ^! \
2 }& A4 H4 L$ }" `, J4 I/ `5 @* T
1 ?. X: `( i+ [% A( p5 p2 p1 C p
! ^1 M7 J6 ~9 j. l, b: Jps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)1 F4 w" b+ ?* I- T4 [; ?. Y
* N9 I- |" @$ a d% Q/ h6 U ' r+ y0 T" }. Q6 e3 b8 p! t4 |
9 w1 } h2 }) {& y8 N' i: K/ Y
首先执行如下sql语句:
7 K7 ]" U, n' z! p9 }4 ^+ Y4 |8 x2 A$ G8 y1 @
" K- Z M8 h; U6 Y% a i
# i0 k4 S6 e9 s2 p! @& dmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
: Q- v$ z! H/ ^, ^* |- r, w
7 C. \8 O# w! t: g; Q - p$ ]/ f: N/ V4 j8 g% C5 Y
1 @- ]; e/ s! q. K# q
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
. J& e" a1 B& W0 r2 W0 p: R
6 ?% \( H* Y. \
% K+ C B" S1 K$ J4 Q# g2 @% s& H+ W
/ ] o9 r1 h2 c: c8 j; g第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为18 B6 T0 K+ H5 A1 C' N
1 q1 D; ~* U* o9 J5 l! d) Z
" z2 H- K0 X% ~# n. `7 N
7 Z$ z" i8 ^& e/ q) l0 B7 p如果运算结果为1,说明第一位为0,不为1
! F, ? n) Y6 `, m; ]+ w5 w+ m# q5 p6 X
3 a4 U, ~' H+ r4 N, k
; t6 `+ s3 g$ C3 I+————————————–+0 k R! j- Y1 k
2 ^0 H d% P% M| (ascii((substr(user(),1,1))) >> 7)=0 |
. N5 M( N5 C$ n0 l
# N6 y, u3 |) D5 Q+————————————–+8 N k8 G( s1 `/ p* h2 _
- P u+ L- b4 U8 l
| 1 |
. g7 Z9 h8 Z$ P# T' K$ l, e
; R" n5 q" U! Y; n& d+————————————–+# i5 J0 H9 H; d
; N, ]7 @7 @# g: B9 o L1 S/ c1 row in set (0.00 sec) H5 h1 i0 p0 c$ j
& j0 C) g- |9 I! |/ `! Q
这样我们就确定这个8bit的ascii的第一位为0
9 `- m A. F, P7 N" G+ f
" e" r: r. D% d7 v- {0 } . L/ L1 U* H K3 B6 E
9 `' I3 ]& C: K4 u第二次我们来做6次右偏移来确定前两位2 f6 ~/ ^$ d( I( D3 W2 e
! n6 P5 [! l$ K5 _! s , `8 _& O" E5 U$ |; g3 U
- ^7 K1 u& G& T6 v7 X4 |
前两位可能是01或00,即依然可以与0做比较,% l; f: z T8 ^" y% i8 u, T! i
4 m8 n% y* i( e. T. R
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
) E0 {# }. d4 V6 o' K9 k. |; ]/ s+ N1 j7 Z. m
+————————————–+
8 V) Q& S4 P$ ?5 }! K* O
4 X/ T6 H/ K: g2 s1 q| (ascii((substr(user(),1,1))) >> 6)=0 |
m. P* S3 _& }5 U8 S) h- L+ u
( n" z. D$ s: T1 G( q$ ^1 P+————————————–+
* ?; q7 K5 }- d, b& m$ u" a( g
4 I) j) n5 c- T6 M| 0 |
9 x5 x# H s5 H- S0 E" R' [5 w" z& G0 y- H
+————————————–+
1 ~0 G; K; B# d: P; _3 ^! ~7 w5 P1 Z E* \6 Q
1 row in set (0.00 sec)
. u1 x( U, ]9 G- X- M8 H& G2 g6 T: z, V$ c
- @5 X. m6 S# N) t- L4 q1 {: c
0 Z+ Q$ y5 {# ]/ W结果为0,即第二位为1
1 Y2 @. s0 S2 C5 I4 i) j. ` ~" U& s/ W) c
. V: U( k- f2 e2 A' v0 P ]% i5 w2 d
开始猜测前三位为010或011
: h; }: Y. B Y+ J. \6 ^6 {& e$ ?! N8 x& e! T5 a
a+ G8 a# ~; l- l$ s, }& w, F
" q( V2 ~4 s ~) m) n" }' { M; `让我们看看010和011的ascii码是多少
$ P) n% D0 t2 h, _
! E( m1 T" `' [' Y
$ `: C3 m) x$ p% O6 k8 u* F3 e k4 Z l0 p0 w; K: Z# V- F3 M5 z5 j# M7 \$ _
分别查询select b’011′ select b’010′& s: y0 z0 Z: i D$ l! b% N4 B
( N/ M0 u) I8 m7 g( \8 A2 p3 D
: \/ E9 Y/ c- h( k; c
* m3 ^2 e# F7 V+ \& t; _- [7 O/ S获得结果 010 = 2 011 = 3
6 s; p- Q3 ?( M: x' B: H" o2 O ^+ X/ Y+ Z3 K; o- u, v' J
' p, e! M4 f: z+ M; {
( C$ Y- H# ^$ Q) s0 q: q
执行如下sql:* {2 y2 l" i& ]$ h
+ [8 d* S+ \3 ^
X8 K' |+ G# t- x; F8 L
/ \; h- G) N6 H5 B o
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
8 U9 R b6 f* f# N1 v6 P
9 E$ A N% S& Q' |! }+————————————–+
/ K# z! Z9 T3 Q' t& ]1 Z$ R5 W3 R, T) J ?% N" f- i, ~0 P
| (ascii((substr(user(),1,1))) >> 5)=2 | A" t9 l5 L9 ?0 }
: P0 x$ M0 A; R
+————————————–+
/ A: f0 A1 _6 f0 E m
, \) [# u) W$ ?( n# I }| 0 |
. w3 f& f+ s7 U6 a6 H8 ~& l
( F; d& n3 a9 x% s7 P; E; G3 G+————————————–+& {1 A) v; k) ^1 D5 V8 V
3 H( m. n+ V6 S" H" y
即前三位不为010,而是011( I. Q# ^% _ E- D
3 C+ [. l, q% s9 k5 M. R
/ a8 J: h) N& c* j
% g7 a$ D! S" d; j直到获得最后一位
& A9 f/ X7 @6 p* E! u7 U4 h0 K
8 Z5 P3 R2 J" {0 x I / \, h0 a7 {( \* D4 |
* b: B- R5 }3 r最终结果为:01110010% p1 G( l1 |7 {
/ U: y3 r/ G. F4 p6 L# h D; |' G# r4 N ; u1 i5 s, B/ a& A/ Q; K
) {) _, V- m9 n- v转换一下:/ v2 C) t5 }: _9 D
& E+ G2 I! x" H- _ " |- S# k y, n, z# D5 ^* Z* J
7 x$ L, @7 p; e6 R1 m( r2 M O- h
select b’01110010′
& g: R2 L% b9 [3 W( t
% H2 q( ~ z! ^0 }
7 I" j3 X+ E, X& q7 p" S0 o: T8 s6 g8 o; l
查询结果5 ~5 b1 @1 X k, x
, d1 F4 B$ K( R7 Y$ A! b' v& B- c
& l4 f* S/ }. C" V" }3 Z
7 j% j$ F9 a. x6 z8 g; a
+————-+5 o$ {6 Y" s6 w' M% D
8 k3 e0 ?+ N9 c* w7 l
| b’01110010′ |
' D0 M4 A& m6 A6 ?) l8 z) I4 ?3 }! E. Z1 I
+————-+4 Y& g* p8 X) O- `( n
( ~0 W3 ?6 W- Y; V$ y. F! m8 r| r |
4 ]1 }: z, \+ H' B! f9 W* w" C. y
7 A( P6 l7 ?; Q) ^6 P+————-+0 N9 s' |: O: n) `4 M* _
: a0 x, o9 y" [8 K" y- I1 row in set (0.00 sec)
: g5 R+ V. N9 w; l8 X. p
1 }$ b" ^% X' [0 C % s; O& {$ z" U% h: {
7 s, ^7 p; Y' P9 R& \
这样我们就获得了user()的第一位.其它位依此类推
7 j* { W8 t& B. B
% {' l; B4 R* V( {. b2 P! `- p* {3 K |