通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位5 P2 E. i9 Y# ^
8 A* e' z0 t9 l3 r
; C( B6 b2 q4 F9 j6 J8 h
8 I3 t6 z7 C0 y. O* H4 q下面将以查询mysql数据库当中user()的第一位为例:
7 Q. g$ h% b% d* k7 ^! g: ~1 m- V# n/ }
( |* L% X9 W: j# S/ a: S% W5 Q' ?7 O1 S- J
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
) U8 f" k' D8 T7 I* s/ M. I# z6 a: q# u4 Z; i- Y
, M# K6 E' ?, e8 C1 p# I5 P
4 t: U: E0 [+ S s6 \* \+ e5 g* ?首先执行如下sql语句:" r+ B! m! f/ Y6 Z5 c1 r
4 Y5 f, C0 Q- _# e! I 4 c/ V9 n2 l$ z F9 w
, H: P) f, f" J- |$ L0 hmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
: R$ H& L: g8 R$ b
) Q* R# f, l8 o4 e, v* i& N6 I4 |* X 5 q" f% }4 ^1 e5 n% H
8 h: z. v" J7 [2 ~9 Q* I我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
' ]$ N' ?; l, r* N( v, C) d
1 y' G1 U5 W& k 9 y2 A' f+ u$ I9 }
5 x0 \ K0 J& u2 \/ y9 ~
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
+ U) [% h0 {" e% I6 [0 X' _
! J. w. U3 w8 w7 E
E. d: B B$ q% H' c# o* _8 J8 _# J0 C% n2 x
如果运算结果为1,说明第一位为0,不为1
0 ^0 {2 d9 F- c' G% ~& c) q) T
& K( ~) g8 ^$ f0 r6 b" L
5 Z' s" w' g# |
, x7 z/ Q0 W% \: Q7 N6 p+————————————–+
5 \. _- D& v3 K; T! T. ]3 ~# c2 z. J' n# C4 `
| (ascii((substr(user(),1,1))) >> 7)=0 |
@$ O6 w! F) h& J. U! v! {2 D6 I, n* u
+————————————–+
; X- D4 J9 \5 w, H1 \" n) i6 \2 Q9 y! c) A
| 1 |6 L, l6 \- n p) e! f
* n( t) x& P, z0 ^8 }6 d/ G5 S& D
+————————————–+' V7 H6 q0 }) d0 B" g$ J1 V5 j
4 W2 i1 c+ m- U9 @( u1 u) H1 row in set (0.00 sec). z; T- g# s$ u7 u7 S
* h+ S* d- }$ ]" V! {7 g( s, p8 ~这样我们就确定这个8bit的ascii的第一位为08 k% Z# f: ]6 I
4 w7 s! v. E- ]" g4 _7 o9 G8 w. |; H
% o& z S; d" M w
/ E8 ~/ R& x& z5 E: X第二次我们来做6次右偏移来确定前两位" x# i# b' f' W* R5 D2 i
8 H: A4 k/ E! \ 9 d( b) S/ t0 T6 c) T& W
! T, B9 ?/ l( @9 \3 x4 f前两位可能是01或00,即依然可以与0做比较,& l3 @$ h$ y5 x5 U4 O; t9 C
) H5 Q8 _2 U0 }0 M' j7 p2 D$ F
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
8 P @' W8 I" c& O& o! R7 p9 l) u* K! f" K0 o* \) O: z) p$ _, P& `
+————————————–+
7 C& I. u [. ^3 M+ _3 S3 ~; O7 K# J! ?5 Y: Y3 c+ v
| (ascii((substr(user(),1,1))) >> 6)=0 |& ]! `, k# \9 y% Q" y+ b6 Q
6 X% m" l/ x- ^& n+ O+————————————–+, D- U! u: [# V* f& q* p: W# P
$ w3 y V, r. h4 L& e
| 0 |
2 C; T7 [" Q- X. k" M0 q/ a5 A" U D5 [
+————————————–+ S7 }* |: }& W, O0 P) N! r
' ]2 K k4 Z1 z% b0 S
1 row in set (0.00 sec) B1 e2 O9 [2 {2 s2 e5 f2 t5 z: D
0 w# b! ]8 Z% Q" t% q$ ?
9 }( E5 C7 e% [3 c% ]
( M9 k1 {. c# s! N0 q7 ^结果为0,即第二位为1
# X) Y7 S- M( B$ v& u* E \+ h$ w) o% M% S0 Q: s) @" t
! F) |7 F% K) R( H e
* G+ M1 U+ o; k( z/ A( K开始猜测前三位为010或0112 b# z7 i. E Z5 E
8 E, d5 O. [! N4 u% C " h3 u' E, g+ s9 k0 o$ G* |
9 f* t: b4 N# [. U
让我们看看010和011的ascii码是多少
$ A! a( ], J6 Q4 Z2 l) y' }3 h5 J3 S4 O+ }
- `" X; ^. d! S8 ]- D! y
, S" `/ O3 H9 u, g3 Q5 p1 `分别查询select b’011′ select b’010′7 o' Q* @/ A: S) L! h2 K
4 r' _2 g( G9 J3 G2 v R$ T$ v1 L
: ]9 J% p' w& G1 F. m: v# _' y0 V9 \: g8 c# k0 F8 ~* L
获得结果 010 = 2 011 = 34 G- X& ]4 d/ K& p1 m: P
l5 _6 o2 E. j4 u# q
! T+ e f' }8 ~2 s9 k& n: |5 Q; u& j2 G
执行如下sql:
7 f/ a# F A- d* U/ U2 C# a# q T) ]& l* b8 Q! V; t
) ^, z: Y! {) h$ A O
, |. O" ~/ ?0 U( f6 m% c4 kmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
: [( i8 b5 s) s, X- d8 F6 m
% @2 L! s4 E2 O8 q% I2 A# a, u7 a+————————————–+) Y) F8 u1 \1 }# g
' X" }) y& M8 `+ o9 T
| (ascii((substr(user(),1,1))) >> 5)=2 |) y# Y& h9 M: d# ~! b
. A+ E/ n0 F/ b( @# ^+————————————–+
8 K( M8 G. v' `5 k3 S; T( V* @5 ]. F9 Y1 j( V8 I1 G$ y$ |* n
| 0 |
$ F+ T* E* s. W' k, g
! |6 }7 B) G9 t; U9 @% Z$ x+————————————–+
]* D) {- S: H, `! g ]# o
& m8 q2 C8 L$ Y$ I. v即前三位不为010,而是011% Z! Q8 e( e: t) Y& p
& }# r( S% [: d% u! F ; N4 D' ~' J5 L
7 E* m8 A% [5 z1 Q; R0 G直到获得最后一位
x i# H1 P, [, w( f1 w9 E
" I* @+ G8 p7 c* s; O / M, K) X& o4 x P- S) \! _
# Q+ F7 s: X: O _+ m( `) z最终结果为:01110010% s5 z0 Y- V8 L m. b5 H
4 @- f5 {# j! { ^ @
" ^/ d2 }9 r* t& q3 }8 G$ R
' }3 t& U* |* ?$ r2 H* [$ z
转换一下:
z, y+ g& b4 o6 k. Z# [8 n2 _
7 J' c% N" E" n8 C; e7 {: a/ h: g, m T" W: L) J4 f4 e. O6 O1 f
: E- k& e3 M% W2 \) z; v. t. pselect b’01110010′- D6 w0 o ~1 x. G( A, X# h
* L. U, c3 M6 H, _$ Q3 ]# s! F # H: X+ Q; g8 `/ r4 H
, `; I/ G( X0 P. Z5 [! O/ u4 [" g
查询结果
* z- M+ F* G1 s" C8 h2 T( G: P1 r6 F: r: {
# c3 F. h! Y, d& Y0 y0 ?& x( ~& F$ V, @* g$ H- @
+————-+: f' b, ]$ j! D1 t5 ?, X
3 n. ~( Z& c! |9 s3 y1 O3 q
| b’01110010′ |5 Q3 b" ~% D/ t5 O& T u8 P7 E
9 F9 i# U' J9 u/ c4 j+————-+
* x' E( O" x6 x# z3 W( _' d7 ?2 [; M, d
| r |
$ s$ k1 I3 }2 j5 _: u) Y& C# T# B9 j# i% H
+————-+/ h6 Z9 k! E$ R4 r" {
; }9 D; i/ |' V3 p$ a i3 P" A1 row in set (0.00 sec). \! l% e$ m, ~* |5 s
- c( O$ b" W, B |9 q2 M( O
% a6 o0 y* K- V9 ?
5 u4 O/ e7 r' [1 t/ i这样我们就获得了user()的第一位.其它位依此类推
- T7 E( G9 I! r1 @. r" @( v/ z) z9 r) E# d
|