通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
2 D8 U3 l) V( p8 W: m, o0 J, ^# u$ T7 F5 ?- z
' M4 m/ P. ^+ N9 }8 V C2 @2 n& F" G! Y7 N
下面将以查询mysql数据库当中user()的第一位为例:
8 b5 I4 A1 C. I3 [( p8 c5 M
3 N) d2 `# _" J
, z7 M! R0 v$ X7 b, c8 f8 h* \, }1 P% Z) K t
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
% w6 O) r" J8 B. L8 _' x, a; [& b8 s# }: S( k Y! q4 y R
- D U' E- X0 Y& p& l
: U. [; A+ o# N首先执行如下sql语句:& ?- w8 U4 f6 B
+ D/ d- B6 q2 `/ `
$ T: K1 A) e2 b5 A& @' [! t$ P9 s* b& e2 _
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
8 D# }$ l1 s3 u& e+ b5 m# D
0 _, Q( ?$ p0 Y 8 B9 b8 Z7 `' @! Q+ R9 q
/ |3 [0 N! d: `% U/ a
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
1 K( p2 A) P/ t; @2 V7 o l
) M* }% l% f3 o, Z5 b& w9 p
0 k2 j3 t; x. j; R( d* S
: M' h$ N7 I& Z第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1 ^/ V8 `0 o) Z9 F1 z: B( k7 f% r5 f
6 S4 Q- Z# c( \) g0 } y
: O# ]1 u2 i4 e$ `# i$ x% @3 A* \3 v2 c2 p+ f9 Y
如果运算结果为1,说明第一位为0,不为1
5 T5 c. J1 {+ y( X1 J% W& A6 M
6 ~7 t U* K* F6 |( T p& W, p4 P3 n, n, o( }9 c+ y/ x3 I i. a
+————————————–+. \4 J4 a* c3 ?- u( I& ^
0 P1 q+ f: M8 g8 g
| (ascii((substr(user(),1,1))) >> 7)=0 |
4 C) C# N: z& L! j; a* c
1 f t, i( `, F& d3 J7 G2 ?; E+————————————–+, U5 T" p0 W. V: `# J
7 Z6 V( ]: ~6 L| 1 |7 O( n H6 j4 B- r
) r k2 B: _. |& ?7 o2 [0 r4 `+————————————–+
1 x- N+ i& Q. {& z
) `% q# S" |8 d9 |- b1 row in set (0.00 sec)2 D* a8 |# T7 M5 Z$ c
% O9 P2 j6 M Q) f; c6 k2 {8 q这样我们就确定这个8bit的ascii的第一位为0$ p) q1 }1 l. v3 B# ~/ q, H
+ u+ H' @+ [/ v& ]
) z. V; S. q- K4 j* O. u/ j, {5 C Y0 c
第二次我们来做6次右偏移来确定前两位
9 K, P8 h6 h, j( \4 a
0 D1 w5 v) }# W$ Q( r. D0 X
* q. P s2 ^# s- f9 d6 ~9 l v/ q4 z) A. c! i0 _' _1 U
前两位可能是01或00,即依然可以与0做比较,
; M" t W# A6 _0 S! J; G3 o# \0 J$ u; a( x; Z" w; ~" V+ t8 b2 _
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;" M' s6 j! U. B
8 U! S0 t# u" X: V1 |
+————————————–+. h1 U2 o" B9 M1 c+ ]
: D ~# r1 @7 m
| (ascii((substr(user(),1,1))) >> 6)=0 |
/ P9 A; {1 I9 B( o4 f) R8 d! l. k- T! I6 z; Z! f& j6 P
+————————————–+. y$ ~- C8 Z2 ~1 d6 D8 ^
$ B/ s7 y: e4 Y: z) }0 f4 C
| 0 |
+ _' }- P7 @( i; |
8 M+ A2 ]7 U0 K; |1 U* s4 Y+————————————–+
, T' P+ a' ?+ _1 ~7 v" r$ w; ~, P9 B9 ~- @2 @/ [9 c
1 row in set (0.00 sec)
d5 t0 A5 F4 S' y& ^1 n! m {1 N
: w- k$ T4 m7 ]; O# f' N# r7 }& c
! ]% h2 Z5 F2 q( h! ?6 x& N/ B4 a: C& X0 G, m
结果为0,即第二位为1; w" @& _! S* e& R! B' g ]
3 B- ]2 m* P( a3 L
: e$ G' p T: d# q
1 s3 M3 M* G/ r$ J0 q0 P! `" d/ I/ G开始猜测前三位为010或011/ H3 \ q: ]; T* ~+ g2 V
+ | Z3 A4 j: T# |$ D7 m5 ^) a
% H0 Z7 _2 C2 L7 @3 E% e+ L
$ E' M& p4 d* {让我们看看010和011的ascii码是多少
5 ]5 ~; L! r4 h j3 ^5 @- p' k$ k- i, ?
) {4 ^+ R, `) I$ A7 z: s; f
- x$ P7 r3 E& B) x" f分别查询select b’011′ select b’010′
& b8 i3 ]4 E& P: @% v$ t: O9 K% E. ]7 _9 C+ O# ?4 D: t9 Y" L
- J8 r+ |4 Z+ _
3 Q5 ^- d2 y5 Z, l* M, p! }0 F
获得结果 010 = 2 011 = 3! S* w, Z3 x8 v$ j$ |/ R
$ ?" B8 }6 A: f1 ~( [' X
1 g7 {/ L1 D* W
2 x1 t. F9 k9 R W
执行如下sql:1 B. `( I7 Z4 ?/ N7 z- R, b0 d
U8 o" X" P+ _# X
3 K* K9 ]4 J8 F
; q" j7 L- s) I5 [
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;7 A; d, W" c' y" e
& ^/ n6 X/ Q! _- ~
+————————————–+
- J/ a4 I8 c: B' [ [1 l+ n! p; v
# m3 d" m5 G! `, |6 N: F| (ascii((substr(user(),1,1))) >> 5)=2 |
4 I' E! I- N8 i' [; X. ]" X1 O- H+ }7 U4 D8 ]* b8 \7 W3 \
+————————————–+
( s3 r$ {' F( C
. R8 y2 Z+ @) m3 Z3 m K' I| 0 |6 I1 ^) J% U& Z/ y1 p
0 X* H+ h6 V& i' Q; d, F
+————————————–+
5 {% A8 `2 S% U1 i2 x1 `6 f- e' B
0 U" B2 s- e, R! Y( g7 e0 Q, a% }即前三位不为010,而是0113 _0 O# N, J: k T6 X, @
1 c( N2 [4 X# @# K* K! i
8 H+ {1 K( z9 o" t0 T
2 X! J2 F$ ?, K直到获得最后一位 e& k! N9 o) q( X4 p
& s, C, h4 D; [. W. s
1 y: P! K" w/ q1 J" Q! F
# Z2 O( ^' y) d9 s5 x) K
最终结果为:01110010
( E/ B! U5 h) O5 [5 L/ G8 J& `; c1 |" A
: v3 O) I x/ R- k1 T' B% _9 B8 Y( c. v0 f0 p1 _( Y' b f* D' t
转换一下:" j2 k: O6 V1 s- N1 S3 c; E; R E
. f" m2 O$ z: C- P1 @! Q' h6 L
; A) C& h! X: f3 Q3 t Q
. e6 y$ O, q L& B! ~+ V& F4 \: O! ]select b’01110010′
3 y. e; C5 p9 f" l& b |* v$ p( n2 [1 W8 j2 E, @6 ]: z$ z( S
; c) ]: |$ v+ y
" C3 f6 e$ A7 @1 r查询结果& E# m! E# z# `9 o0 v
: N. P* z+ c) `) t0 a
4 H/ y& r9 n4 M2 G, h
& z' ]* `3 S5 q+————-+
: [! u3 U5 a3 m$ U1 G8 B7 X1 r
& g- K( u/ C, S+ A* s; D5 ~| b’01110010′ |
6 k0 I8 ~( j. C b3 R7 D' y: p A7 m
+————-+9 [) J( u1 A: U7 h3 V. Z' D# R
% m$ _" D6 k0 q/ j, B- D
| r |
7 g# |) p. R. t3 n9 v# J. J( p1 I1 _- E/ W5 m- x
+————-+
9 ^: ]& c! ^* }! k% e Y+ v4 g1 {# c- ~
1 row in set (0.00 sec)
8 `/ {/ M |- l, }/ f+ Q+ R
& a% J- X/ c1 ]' R/ N: m4 L
; g7 a2 F2 I" Z% U3 x4 T
# b5 \9 U: j6 O- G' D4 |这样我们就获得了user()的第一位.其它位依此类推( s0 K: D% W% N! _( G* P( t X
' U. w+ D0 a, N( s. Z
|