通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位" C- l; i+ o" ~, M6 v
( `) A M- d* s$ {6 {, H * X7 ~* Y/ U/ j
4 M+ r- {4 C7 H6 v1 E6 F0 g
下面将以查询mysql数据库当中user()的第一位为例:: A. H6 B- c: @: U# c
# ?5 h7 f- n! {9 W }: n% n; d
3 ~. a9 M3 f( u8 M2 `
) \0 ~0 i' O- m; S( e/ {* c* zps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)# j5 r; ?% F! A2 a" P
* [. L2 S _$ m
3 o4 d- @2 d: y/ I6 o- Y9 F7 A7 u6 Y8 P- N- B x H; ]) N
首先执行如下sql语句:* d7 I& W' q9 f
$ O8 m' j$ |6 M0 n" Y7 d* w2 h! k' e
, t7 D' s' V( A+ {7 K
; U0 K* G3 \+ q x e: w( ]. bmysql> select (ascii((substr(user(),1,1))) >> 7)=0;4 r4 L+ h: B6 I1 b
6 n* T' Z7 h, {
3 H2 E7 J& _$ x: s {; T; c" ]: b6 P; X+ ~: |0 {/ L) g
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
+ t- G/ J. w% a& _* X
: t( }: t0 k* n1 V4 v9 R F
1 s; |; Y0 |+ e* |
" `* @# _2 W1 s第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
: z, H4 I: \7 o* _2 p( M+ P# @7 B: F. V3 u* p$ @+ Y
, C7 y7 y6 N9 g1 s3 o1 R
/ h: U) ^. Q# U3 h [如果运算结果为1,说明第一位为0,不为1; `' G y+ ` @: D
$ D5 Y& `9 a& Z1 e4 b
_; V- }) @' K' f5 N- C5 j
0 ]: }4 W3 c" D2 z* q+ S+————————————–+* u0 L5 s# O) A' r
- S4 Z2 | [' E& Y4 L$ T
| (ascii((substr(user(),1,1))) >> 7)=0 |& w! S- F- o- e! `' H4 T
2 }% C/ `4 Y: s7 f1 Z0 m- f- s
+————————————–+
" a0 M7 `9 M8 R5 k/ L" s9 d$ X* H
5 z2 E5 t' a+ n7 {) O. @( D) D| 1 |3 A" c- {2 F+ L% }$ S
C( G% Y9 L f9 i# H4 V" x+————————————–+" Y; V* y- r) c: m
; a. D1 o% e; p3 k0 _3 O# R1 row in set (0.00 sec)$ p$ c; K9 N% \, ~1 B9 e) i
0 f2 \# T2 }! a) C9 ^4 R这样我们就确定这个8bit的ascii的第一位为0
/ i! u% V7 s. J3 v$ h5 I
( b. p( J, E) M4 u& a9 C
0 I% v6 _) y5 I" \; m7 _$ F" r# w; x+ G6 G
第二次我们来做6次右偏移来确定前两位% N+ J# a. i4 M F
) w- c3 y. ], A4 ^
6 V7 c4 t" m0 X5 y6 o, v% E
9 T4 S3 I" m# _* e6 P- A" y" e) g) J前两位可能是01或00,即依然可以与0做比较,0 ^( S& K) n6 W% l9 q6 \# @8 |
3 \, Z/ d0 l1 [8 @5 G& M. Mmysql> select (ascii((substr(user(),1,1))) >> 6)=0;. o7 a/ f3 {( x( A1 c) N
3 s7 d, Y! V0 g+ w( m. ~" j+————————————–+/ f( ~+ ]% `. D0 f2 H
7 Y1 T8 {: D4 [0 L* M" Z, C( i
| (ascii((substr(user(),1,1))) >> 6)=0 |0 h& B2 p) C! `1 R2 z3 Z: b
! S0 V( d# T e/ B7 G5 [) Y4 e
+————————————–+
; b5 {" t( m; F2 ^
2 v4 X a% K1 Q# l5 X+ E| 0 |
, @5 U/ k* Z& k; E3 V3 i
: t& ~$ m1 N- [# k, d+————————————–+! n4 Y3 W) w& @) j
* l/ h/ Z% F i+ s/ T- D
1 row in set (0.00 sec)
0 L3 i' `" Y2 m7 l& A3 q' y0 T* ]# E0 q( t9 t. k
2 e+ V& O+ n# ^! W1 e" r7 \2 \0 m4 ~2 h4 B3 v
结果为0,即第二位为16 w3 L" D5 P8 R: ]1 x& s& d# X
; Z4 J7 M* Z( _ y. U' C6 X! }
, z- Y. T7 U; [8 v: @
5 x: i s* X/ [开始猜测前三位为010或011# [8 V" n- e3 r+ k& P0 i2 z' T# I, ~7 C
/ H. m% P6 s! {; j5 Y6 {
9 Y. h9 z: D5 g+ l9 x! g- j( R" }2 i+ p
让我们看看010和011的ascii码是多少
9 D! X4 w4 A$ P. V/ O
/ e+ q$ S* d ?! L: E- y4 L9 B$ y
; g! O, h/ D/ `1 x2 R- M5 y2 Q% V- ], ~' L0 h
分别查询select b’011′ select b’010′
/ x8 k. B, Y4 q3 O9 Y0 V* T
/ Q: ], i4 A; {0 [3 ^
, x' t. i4 w3 o7 k9 k) n* G0 N D
" w! H7 G3 \2 P/ S( r3 l获得结果 010 = 2 011 = 3& I1 D9 P( G; p! f
( q+ L: _7 h; g: r. Z5 a# d5 y9 {- d
6 k2 Q2 U( ~# ]+ f% S
3 A3 e7 D+ f9 m1 f) k执行如下sql:2 S G: x5 o3 V; p8 |' a
1 W# a+ S0 \2 U' f! J8 p% |/ Q" G! `5 ?
" V, w1 H; h, V6 r) J
; \ B7 `: D. ~$ L5 l- emysql> select (ascii((substr(user(),1,1))) >> 5)=2;
$ l5 s2 X' _% \8 S: r, i$ H$ W. Z; s% W1 q- m) ?
+————————————–+, w% @2 I9 j3 T6 q y0 l
4 ~5 r/ ]- ^0 A Q7 K8 X% \* O| (ascii((substr(user(),1,1))) >> 5)=2 |
; H0 p! I) y' i
5 W+ o$ n# p6 f6 S6 ^+————————————–+4 t5 y+ y+ a. f4 M* T9 N( D4 ~
- k. r" U) |0 i/ c! w
| 0 |
9 }# Z( k' }& r) y& U
+ a2 o, `9 M( I0 X+————————————–+
' O! u2 N5 h$ o O! I/ \: s6 i- v/ @; O& E5 ^2 L, o1 d" p
即前三位不为010,而是011
# E/ }! \! i, U; u, @8 `2 C2 R. b5 p$ o* f! s
! {* b9 B# O' z; o, n
@4 l8 a( C: o8 |
直到获得最后一位
4 [3 l3 S+ V: U7 k2 ~3 h2 [; J' I1 s6 k1 [
$ T0 n n+ l: g0 z
5 D4 S3 I) c2 |( y; W E8 R最终结果为:01110010: a4 N- m1 a4 Y& N% e8 s
' i6 C' j# k% Z; G* M/ b$ H
M4 e( V! \$ U* P: X# l. L
5 u4 a! [- e6 b1 e; V! e8 G转换一下:+ q% a6 Q) @# |- M, F# G7 j
7 J3 M9 |# {" ^8 @0 t- T) @
7 E0 o9 V) q9 s8 E$ A q) g/ @$ N* g- }0 x8 ~% k" H' m' X
select b’01110010′
5 Q' P) @3 _ R0 g6 A: P/ \
2 ?0 q' w L* \: i4 I" k, {
& G+ e2 n9 A' h9 q2 t2 H
% V a8 R1 f/ c9 S$ j; j+ o查询结果
6 ]/ ]5 ]% z: z9 Z( h, ]: }; G: |
; K5 U' M6 z1 A# z, j$ v) ~: J
' a$ ]/ ~, p' \3 @( ~" y
+————-+
# }4 D. e% {/ M' N
3 ]0 K l z" r! M| b’01110010′ |( w. N d9 g+ P0 K. W7 I5 X
1 `1 N8 {3 W: ]0 m
+————-+5 F* F* I5 Z) i
0 F4 E' q( [! b2 D| r |2 k1 p% g3 s* W# g$ @1 r+ f
: R5 _0 ]0 d2 B
+————-+
! L, u) d6 h4 x6 N
( T2 }& |0 }/ t% C- C" |7 ~6 T1 row in set (0.00 sec)
" ]$ v* T2 h0 H, C2 y2 A c/ u' I. }. Q' X& R8 j1 ~" ^
- A$ H; c& f o
/ r7 Z2 `" ^# M$ a% `3 v这样我们就获得了user()的第一位.其它位依此类推% p# |" C5 U! i3 |
8 Y- A+ [9 D& n( _/ ~' q/ R. b |