通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位& z4 d; H6 H& Y) T, N
/ m3 r7 r3 h) s% B7 T
7 q- P) H' }) n8 b7 H3 @4 g2 Z; u5 T1 ^
下面将以查询mysql数据库当中user()的第一位为例:
: c6 g& |' ~; C! s2 U, r: _9 u
! M# ]% k% Y% a7 m$ \ U/ C p A2 I) f2 F6 w8 X1 ?
5 I7 b' L( l# y" y
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
$ K7 |8 e/ ]" b: E9 }. A& g. Q! E: F% z
5 S! q! q& F% `" j7 n' z
+ [5 O0 ]7 N& g. m2 u* i首先执行如下sql语句:
& g5 O! L0 L A6 k- I6 ^7 q" F
6 c1 w2 k% J: d" {/ Y; e , P1 J; @5 a2 [; @( [
, N& h0 t, @% n" i
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;7 r( ~6 H0 p: p+ W1 O" o
) M6 [# U! M4 H9 c+ \
2 F+ G$ O" X- ?3 G. Q+ x: l; c
6 |, L) I! x: P/ ~) C* \
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
) Q0 c3 `& p1 V1 G! {: u' G! F$ Q b$ O" C |" ^0 S- g0 K+ `7 M
5 P% I1 [( J8 h1 s: g" I
- m+ n' |/ \6 B4 {) |1 h' B8 y# K: N9 M第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
. T, {( n) y/ y* Y/ r& d" A: m. D
$ O3 U4 J! ?2 h% T: D
- D6 U0 V% d$ J8 v如果运算结果为1,说明第一位为0,不为1
, d& L/ T( ^9 Z, J/ H! o$ b. \3 @, F S( A
; S. n% d8 Z8 k. t8 @) Z
$ K3 D! D$ ^" m! b+————————————–+
1 K, p: c) P8 B2 q5 i+ M$ D, n+ H3 {8 T( i) S! i! c: A+ n% B
| (ascii((substr(user(),1,1))) >> 7)=0 |
& r- N6 b: T6 A6 W7 F+ _9 u
. G1 `8 Q) p" [4 T( `) ]: }* w, ]+————————————–+
- b* j4 m' {3 [, {" S) X5 e' k# P) Z; ?' V
| 1 |& ]1 x0 G9 _2 o; M9 P; t# Y' b
, {: d& V( a) ^5 q, v+————————————–+9 d( g. I* F: X- I! q% p' U
$ T+ k' U7 m6 {* M+ G1 row in set (0.00 sec)6 K- G* X2 X" B* f% {% l8 q3 A; r
7 U# L3 M3 V% h. B- G( U# W
这样我们就确定这个8bit的ascii的第一位为07 s3 j7 ~" y# _: s
& ?+ s; }; E9 U# s4 v 8 G9 x# f5 T1 t b! Z7 ]
( y0 | {2 a, z: u# I第二次我们来做6次右偏移来确定前两位0 A# W) `; Y5 L# r
. Q7 q% |9 M I: E, ~% C+ l8 e
, L7 c0 J' s. y- R9 x) u$ f2 C+ p
* [# z9 l. y& b! E! u6 B/ F3 b$ ?前两位可能是01或00,即依然可以与0做比较,1 S' O8 B: |1 N* Y2 y. Y( g! _* `( w
2 G: h4 g- ?- y! [* B0 T. O# l7 Xmysql> select (ascii((substr(user(),1,1))) >> 6)=0;7 ~9 p" S2 Y( ^, z7 Y q
* M# U+ K) C' R" x0 m
+————————————–+/ K3 X% P# Q, G4 g, C$ m
& e$ Z+ i# c) T! Q' I
| (ascii((substr(user(),1,1))) >> 6)=0 |7 H1 C4 F" S8 N; `' Z5 U! p% V
: X& h8 @# m! A5 y5 V; I+————————————–+7 C7 a/ L. y: a1 r* o- c
; m4 d2 _7 z1 s5 c$ x
| 0 |' L/ S4 I' ~ u' W& ?. }
1 |9 t' F3 k9 C5 O7 p- }8 {& G+————————————–+
6 J* i' f8 w0 _! p
% }9 d. v! `* ?7 t1 row in set (0.00 sec)
5 b% i, J7 B( e# E
8 x' } s/ o5 ? ]! m, { 4 x, m! Q- H+ |; F. e T @# n' W
/ @+ p* ^& ^' x- Y- l ~
结果为0,即第二位为10 ?2 Z7 a0 u+ }3 e A
) k2 T. j/ p4 d; W( W0 V
" H7 U3 G; I6 C0 ?9 t+ p$ V+ B# q- m8 h# X4 B6 G
开始猜测前三位为010或0111 L' w( l0 O6 N! ?, l' s8 p
( |) ^% {% H! c! r' X: V L, e% }4 D
! ]: U9 U( ]3 y+ E5 i
* E- [& _8 M+ F1 X* |) i) f# S让我们看看010和011的ascii码是多少! b7 r- N4 |3 z7 Z' w
) M4 ]! b; q5 M9 Y3 s
2 ^# |. f9 P J1 a$ }
0 \2 {: q" J8 r+ Q/ Y分别查询select b’011′ select b’010′9 y; N/ e8 M1 O. h
( W2 q- s0 L% i' `5 d5 g8 U3 D
5 N# g" V9 h! ?0 Q' i5 [7 `
: n ^+ d- @% Y/ |' r. O! Q
获得结果 010 = 2 011 = 3: c9 S3 D2 w4 @7 e q
8 H4 U# G! m8 m) D" H4 C# l) b1 ?5 g
9 [7 h2 w. L7 T& z/ O5 C$ k2 A! Y! `
执行如下sql:+ _' J" x1 s9 ^1 M: N9 G
7 v' m; P8 Z4 R9 t9 ^0 v6 G
. O% H' C F5 r" Y) H# K+ Q! S( O) B6 ?
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
$ {7 I- S4 ~+ |6 c u
1 ?. X, g: l* }& D4 g+————————————–+
* e) r, }% @" Q! P. |4 q8 u+ E' ]7 m# W* Y! @
| (ascii((substr(user(),1,1))) >> 5)=2 |. |. c Q5 Y8 h) Z( ^
5 o' O4 G g0 B8 w8 |( p+————————————–+0 j* D- {: Y- Y# L4 k" U
m6 R ^3 M7 i* K8 Q. ~: L| 0 |2 z! u8 E# f1 x w. |, J
/ }( @* P0 Q* r1 u* {/ P+————————————–+
6 @- q; D+ l) h! P% P( G
! W. O. K8 l% U即前三位不为010,而是011# ~' N- c- ?/ F3 o
5 }* a! N# F1 S$ W: @" M
0 R( b3 ~7 x% K7 b; ?: H1 C$ i! s
直到获得最后一位
0 H4 m/ l; U2 y8 z
1 s+ Y% ]2 O# ^! u2 ^6 i* D3 I( G - o1 l3 p: E0 g& n" b. E2 s! A
' S, s* K2 y. A' m/ G
最终结果为:01110010
+ |# D0 ^0 }8 w( j
+ b" T' [& S& x- x# r
! ~1 `- Y% E# h0 Y& h" l9 y& W# @- y: i5 ]5 ?, P: K/ H
转换一下:2 f( g' c: w7 S- x) y) E
& q* x7 Q1 e- p, }" b- w3 C5 R
* D7 i# z( o% D- Y' N$ W
/ s" O, ^. j, P u2 K- d/ g& dselect b’01110010′
: _; t4 d% n& x! p) e7 x5 e$ r/ X( g5 l% k3 P( }
& \" ?. m/ ~3 o1 v! n9 @5 v$ z; L G* u( g: S6 d! Q
查询结果. z9 a- h3 s. M% A6 e# p+ N
0 I- }3 I, x# ?
' i: D; D. b4 ~5 K# O
9 Y! l, b' Q* s# E2 D% G4 B& w" [+————-+
6 G- X% d2 J& h3 E2 F( K1 |/ E. x" ?1 C) K) e1 C9 J
| b’01110010′ |6 L( ~3 p0 Y4 c) Z! Q5 ~$ P2 _" z
$ P C, ~' u; Q7 Y- O0 D% q+————-+% e' [ m* T2 n
' _6 Z* z) \1 H1 W, \" w7 i| r |
( v4 ~) K0 g; N* R" Y. d6 ~( m o3 Z* r; b9 I) S& D
+————-+% f, s8 f; R7 Q
! G8 \: k- M! N S
1 row in set (0.00 sec)4 q( q& q1 w; K `; B# F ]
5 f$ @& j/ }; j$ y0 n' p" g 4 A$ ]7 N( w+ \- o7 }* y
9 \$ V7 D3 k5 ^4 d6 y: K" u这样我们就获得了user()的第一位.其它位依此类推1 `6 G$ a8 `& w- P! Y& T
0 e1 C4 p3 x+ {2 N$ w# Z8 g* ^ |