通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位3 W( l3 G( M4 `
/ W8 o$ }4 X" x+ M9 r
" { F( k( ?/ j
, }+ g9 o5 i$ ]+ u7 m$ F0 _' H! M
下面将以查询mysql数据库当中user()的第一位为例:: R1 k1 d* Z% m4 @4 P9 n1 l
' Q( p; }! @* m7 c# {" C: P1 d
; t( E- [0 y6 b* V
" |: g0 D6 I* ?1 g' E% ups:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)* H6 e. W/ I; ^
4 G. ]) |/ A' V6 C9 a
# R4 G: V0 I- B& Y
+ _9 ]* ~. V/ S首先执行如下sql语句:
# ~; r+ m' Q& G {1 z1 i* w2 o6 Y
$ \1 E' u% A7 ?6 [9 Y" L0 g/ X2 O8 ?1 r* K1 o
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
7 s* ]- S6 u5 u8 ~
8 Z8 X, s/ j7 H- E( f' l! E# k
2 \+ h" e, T; n) V: q- B0 d
5 T- B$ N! d6 Z- S我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的3 ^3 X8 |7 A1 d! \+ F) J! Z
/ y. K( Z: d3 d: [9 M7 T7 `
7 [# p8 ^, b) e' @# f! `! I. n$ k9 @8 C
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
! q9 k- k2 \/ ?+ i: B7 N5 V a( n6 L& O; I+ h' z& A
! A! H1 Q$ {5 f$ Y+ u: G* f3 A9 p$ R
如果运算结果为1,说明第一位为0,不为1
" R' o& N& Z: [% _( D
: G2 H$ P# @8 ~2 V
: ^4 i. f+ s2 n, f8 O. Q% c, V
$ A) s2 j4 c* }- p# f4 Y0 X+————————————–+( k; Q3 h' M, s/ i
2 g3 a8 d3 R- e# I0 w| (ascii((substr(user(),1,1))) >> 7)=0 |
- k; z% k7 z. C+ v& O: \( |6 R6 u C5 ?0 ?3 Q0 r+ C
+————————————–+1 q2 z+ d4 q# [2 l
- u0 p- r$ o' h5 {
| 1 |% I; v+ w' |- q# x. n) S
R4 R' T+ ]+ W T5 c+————————————–+
# p' Z/ }* H0 |# c; d8 n8 ]( N( I/ a- O) }0 V
1 row in set (0.00 sec): h3 O- R, F. J3 M& A, d( A( o* h
9 T2 q* z7 y* \
这样我们就确定这个8bit的ascii的第一位为08 R# E/ K: h/ S/ Q" P5 o6 {6 ^5 z: r
* z* J; ]3 x# H5 V1 W
l1 q# Z! Z+ Q7 v [- s- Z
j: g6 h$ s/ |: F' l第二次我们来做6次右偏移来确定前两位+ U* c& H8 h* t+ f8 }9 w
1 a* V: p; W& \1 f3 j2 Y6 \
2 f6 i8 k8 X% l" ]) n; j! T$ @( j9 l" X8 M, M R
前两位可能是01或00,即依然可以与0做比较,! x% v6 u& R$ f: Z3 x
: Q Y' u! ]& ~7 w3 v0 {7 [( p; a
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
5 b; X& L/ H: K1 z* P
" a! M d; r( a) L( @: [3 c* e+————————————–+5 _4 M. o( N5 _; n/ S
" S: u$ x1 X9 _1 |% t4 g| (ascii((substr(user(),1,1))) >> 6)=0 |5 D4 v2 r. V" D M7 [* \1 d
* O# G. ?. O5 I' s1 Y6 A6 l/ [+————————————–+6 {( n* X7 ]. d$ n t( l* s
2 U5 U7 z; A7 N: _* q# b0 ?| 0 |$ h9 R1 q0 {$ k) g" }/ F
* _7 q( a8 |) e5 S" u+————————————–+5 n8 F+ l" u- E
) E! k: k) Z* e/ g0 b X( f
1 row in set (0.00 sec)0 A5 L/ i* H/ h. h1 o
0 {# X2 I [% I+ Q
+ \7 |8 H k! C
& ^7 p; ^8 l7 @$ P" `结果为0,即第二位为1
2 J# A- Y1 Y2 r, h5 g/ k; }/ B4 P R# y! G9 D5 Q7 g/ \
, V1 a5 J( H( f( a2 \# l
9 T% ?% U0 O# G9 r# y) u# E( G开始猜测前三位为010或011. M( |7 P5 f! N( t$ E# w
$ {/ s4 S+ D0 n3 r8 T, r x
+ ]/ @3 }" f7 p$ b9 H6 i5 q, P
z o1 S6 p1 }, z: u& w让我们看看010和011的ascii码是多少
) L0 N( M* W+ U9 O6 n# ]/ y- b. `* o8 J
1 B# A$ E) |1 `5 Q
& b( w. g8 |3 j, ^分别查询select b’011′ select b’010′( B2 k; V9 j( U8 ?* W% j
( U2 f. q/ c! x2 B3 K 4 @, g4 _- Z! P9 K! I& F% r4 _7 K; s; I: _
& L# w9 {3 r/ K ]) C& K
获得结果 010 = 2 011 = 3* i5 b" }( t, E/ `" f# h V+ n
) d+ s, H7 ]5 T3 H6 p% P" Z; G
! D$ F8 O; H5 @4 t% `( F
0 c+ |2 q- q# e执行如下sql:; Y( u6 v" i- D# w, u5 S9 `3 o" x
9 [9 L$ y1 J, C' T7 V
$ u' g' d2 }; H: u2 Z3 A3 a5 l5 y( e% ^. U0 T5 J
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
# L0 {4 I$ T# a* q
5 p& R8 \$ l1 C# v: R6 o# O+————————————–+3 }2 j" c) k) ~( o7 T
" {; q' C4 X6 @4 w; |' I$ r! D9 `
| (ascii((substr(user(),1,1))) >> 5)=2 |
* G# w2 w2 c) P" S ?) S. `( n' L6 E4 q5 I9 K+ `3 ?# ]+ g1 g
+————————————–+
3 a0 x# Q! ~" \5 p: g1 m( `0 q' A$ D
| 0 |
2 O( q; J+ e3 `2 d5 g/ J& P9 h5 ^; B* E. v1 ?
+————————————–+" q' C2 I9 H: X- B- N `# d
$ Z, x' j# i' Y! v8 \: ~即前三位不为010,而是011. W8 G* ?6 w( y# E( p: O* G* u
/ T# M# e0 E8 x6 h! Y
4 g9 G! M, K, @2 N4 x- R
0 d; c4 L: E& K2 K) V直到获得最后一位, F% T5 I0 F5 X9 W8 P; J
/ C' }7 v7 ]9 J& L
- s- M$ R$ a/ T3 b
/ u" @ C8 J# ]. U- ^2 w最终结果为:01110010, U6 F' E' t2 }; R# D9 R0 M- N; V
" n" ?7 o- ]2 {. H & I4 T+ u5 I4 X1 K" }+ c, h
2 r1 t0 Z/ n! h" U6 X, i% t转换一下:4 M3 O8 d5 p7 l0 N0 N
1 K& n- c% G3 c2 ]: ~$ t
# U2 h% F( I8 }& D
+ D8 K5 u2 H0 }; v0 E2 g1 {2 yselect b’01110010′
: ?9 G* j7 E, s; v2 Y$ r* c' g: E
4 I0 z* l: b- j0 _' x
8 Y3 K3 r* J5 V查询结果% z& y$ X( j# z# P2 p6 {8 l
* q' l& [" x1 }' S, S8 @
# c3 }' H* `: T3 w; {
) C i# o% A; E0 P& n% W
+————-+
# s# X9 Z4 x! h, W2 ^
K9 x; a3 v9 v0 ~| b’01110010′ |( n6 z6 n' n0 @3 M4 M4 A' c
$ ]* A! b4 i) I& D8 S' _0 d4 I
+————-+
) ?- u2 c2 U- p, s3 Y, Q3 L. ~; I& R+ ?
| r |
, b8 d: C3 [6 X5 K0 Z0 n& J# [" T; j$ W3 C
+————-+
4 R6 s- ~1 R S" d4 F* u5 @# {) |0 f1 T( H6 R/ _& B
1 row in set (0.00 sec)
& e E9 x7 b" g, M. s: K5 h& e2 c0 ~( V9 x1 A
8 Q7 i6 W+ @( y7 h5 X' P' L* X* h+ {/ V8 y* ]. {+ Z
这样我们就获得了user()的第一位.其它位依此类推
/ t. d; ^0 r3 J6 q* e; ]
& T' k/ b) k6 D/ Z2 H9 l- Z! [ |