通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位' n' R4 A1 D2 I! }2 V& d( N
* |$ j1 `' c' U# L5 i) l+ c 0 V! T3 L2 X! P9 N* T
. l v' m4 b% @$ w' A
下面将以查询mysql数据库当中user()的第一位为例:
* u8 K1 @# N/ ?
2 X( m% ?5 k/ \; M( c% D/ E# [
6 x& O% L- ]) j5 Y$ y" {7 Z9 k& N$ Z
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)0 C/ v2 I( _5 ]1 U4 a5 `( W: K
6 D, d8 z$ Q: v6 E; f* d0 A
) J/ y B y9 S" P0 e
$ \$ i/ w# Q- \ `5 i; I/ |: K" a首先执行如下sql语句:# }/ q0 v3 }/ E' m
6 n3 E4 p1 o8 @& d; B
1 p" w1 a' d' o
+ ]! k& X8 O3 L* O& Qmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
/ T% i+ J: \. J Y) ]# L9 T3 Y& y e7 B/ {5 C ]
; ]: [. V' m; U! B1 s$ \+ w) J4 p" c
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的5 I8 I" ?) {! |: B! V2 ^
/ b* ~" B0 }; t* o! x
8 i4 x: D# |* B& E6 M8 J6 }% D2 Z0 h3 j; n
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
$ W( B% |6 K9 F j( O
& u# S( E' ?* R9 X8 ? ( v/ v( ]) \8 F* }# c- c
- t1 x2 S3 I( K% u- B, s& L: F
如果运算结果为1,说明第一位为0,不为1
9 M; e/ A+ k5 ]. v1 U2 g Z* C
6 b' Q" D4 o5 t/ U
3 w7 P2 y$ b( B1 i! S9 b$ H c2 M! N; B4 x4 v+ Y
+————————————–+
# }! s8 c/ i ^6 [& C+ _
7 h. S! d8 n. J" a9 V% T| (ascii((substr(user(),1,1))) >> 7)=0 |' A$ `' M- a$ ? \3 y
o. ~. ~+ N7 @7 s4 }9 U* W: ^+————————————–+
$ E: @4 M8 w& u, x s' @1 U7 g! t5 s/ t( }& Q
| 1 |9 l7 q. U/ [2 y" @; n5 p
4 ^! ?8 p& @; U8 H# z2 [$ l/ r+————————————–+
4 a7 b+ T3 S3 f' V9 X, f Y
, |. w/ D$ r* ~% K7 X6 `1 row in set (0.00 sec)0 T9 ^6 O- X f- \8 Q$ l# K# u+ |
* v S. ~! f2 K
这样我们就确定这个8bit的ascii的第一位为08 W. C: x9 j. u+ G( V
# E4 i; F; F/ G, Z6 D1 f6 b( V u- C* @) O# }, U
& Z- o% }: ^/ I, S0 g$ S第二次我们来做6次右偏移来确定前两位
! f, k$ s: e( |! m
9 o8 b* l7 Q3 \/ H/ T; l
8 \" d& E7 i/ S/ |! d- V/ R J
# A! ?+ N! z" Z8 d前两位可能是01或00,即依然可以与0做比较,: w! u0 W) ?* t7 h6 i8 y5 I
2 K' M6 o3 J! q. h: f+ `mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
2 a1 q( y, Q, D/ ]: f' h* ?% A+ u: N- @4 U8 u' |
+————————————–+; k+ a1 X! x7 W5 v: q- O
% J# H; M( F: g( {; a| (ascii((substr(user(),1,1))) >> 6)=0 |0 j$ E% p. i6 X& g' c. p# d
' [ b! N7 ^! x6 v
+————————————–+
& O8 B+ G' K! [, H4 O7 W5 q
2 R* V2 @% r9 s8 m" K| 0 |
7 {3 H' H5 g* @' H( x P9 l! o$ k8 V& ]& N9 E! @
+————————————–+2 ]1 |; c% r0 h. O
5 K- @/ h Z9 e1 row in set (0.00 sec)
, V4 l. h* G5 {& k/ \
' [! S# v+ h! _- j* T
/ z4 \6 K5 A6 B0 r2 _
v# N/ q9 r: T. J' w结果为0,即第二位为1
# F& P) h' C7 N& v4 I& ~+ e0 E' O) X$ c% x& w/ |. J) x; }: e
8 ^8 L) _. u3 ~7 [' {. q
9 T) Z4 z9 G$ @& G8 b7 f. ~% o- r* `! O开始猜测前三位为010或011& k& f8 _( {- l" J; j
8 Y, O- Y m7 m2 u; y
7 O$ @# v+ E1 P. P( b# S
* v$ u7 a2 r6 ?& e. v让我们看看010和011的ascii码是多少 P0 N/ [0 ?" Y7 [" R& z
2 R6 X0 E8 ]$ q! S1 W
/ G2 ?/ m9 V* j0 W5 U; Z/ n& _; M' [4 q% f
分别查询select b’011′ select b’010′
! _( U; [9 {" S8 k$ Q
" A) j0 S4 F. j- x
: u3 f9 o- |6 o/ [, |5 {9 ^* L
5 C0 ]- t& E9 w, j7 c. m/ J获得结果 010 = 2 011 = 3
5 O* n4 a2 m+ D) |' f/ Z& C2 g2 q( `1 V4 M
; e7 }2 ~- S3 K) z7 q/ K5 `% [. z' Q: q! g0 a/ S u
执行如下sql:
4 r# k6 B! a- Y. ~& z' ]3 H" {5 C6 \! q* j7 Y4 r8 l/ e
9 l6 X1 j" o: p2 p& J
; I# U$ w* z. i$ j4 e9 q5 ]
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
6 z# l# t6 z% z- C+ K3 ]2 _" A
0 E* z# J5 ~% _2 L& W, p$ D+————————————–+
" [" \" H9 ], O5 q/ i% w1 N0 K( c0 l4 U2 S* r! z
| (ascii((substr(user(),1,1))) >> 5)=2 |2 i# P/ s1 L/ N2 B1 R
# j5 t" {' z& i8 A4 Y9 Z+————————————–+
: A# A; F( t1 K' O' J6 p; \$ t h* [3 T3 [2 C
| 0 |0 H2 G% K! t7 U" ~& I
( }1 B3 U$ J3 k4 m1 T$ B* D+————————————–+% [$ F1 m1 b; t) L3 c2 e3 y
z( s" |5 F- H3 }& v- a, k4 w即前三位不为010,而是011/ X! j$ d$ d8 Y. b( b7 p
9 ^5 u: q( ? v4 i" ^5 b/ Y# C
6 i D' u; z6 z" ]' ?4 W0 K8 g
( o9 f4 Z% x- E+ p& D直到获得最后一位
Q6 K1 V# |: V6 t$ h6 D% r) G1 r
. v4 \2 M2 `( @' _5 S6 O
" I2 S Q8 K: d0 W
6 V- ~' ^5 `" M& J6 H6 Y最终结果为:01110010
; V4 m& _. R9 g0 r2 K3 [5 _3 {
, L( G1 [8 A, p4 Q" D6 ~
8 d/ j! a, _4 k6 Q/ }% x6 a+ l
+ }- N* i3 b8 Q转换一下:% c5 ]4 d: R# ^+ z3 Q, V
& [6 ?. E+ |0 k; G/ v' d: V- h 0 E. W# U9 f& n2 e
3 P( ?' e( L! K1 q1 b3 {
select b’01110010′
0 y5 P) a# O1 A
/ r& @- N3 u; } : K3 K5 `; `, p) R& r, E8 t/ Y
8 y- h {6 B- @5 k% ]! Q
查询结果' ^6 z& R. z e. I- q u
5 \% G- s& ?( c( } 1 c$ @9 D" ]) P7 B
8 h+ o% c2 ?8 [( L+————-+
( K6 s6 Q/ h2 _$ E2 @& ]/ k$ N9 d2 N! x" F9 J- a' U
| b’01110010′ |
* x( v y/ \5 Z+ e; u5 i% f
# ?1 Q B) y" Y- C8 ^4 ]$ s) f& A9 Y+————-++ L! |( Y3 R& S( @. u
7 G1 i: ^& q( L| r |
2 a0 ^7 a4 b( r
2 \1 A) W/ s0 a+————-+- ]) f6 n0 k: X" q5 w
. C! Q5 C& u; F$ }" L( b% d
1 row in set (0.00 sec)/ W9 G' d+ V- [$ F5 r
" x; u- x3 |7 `# z1 R) J
( u& T- ], N) N8 R1 S/ w, X6 u5 P% \8 R2 Y
这样我们就获得了user()的第一位.其它位依此类推
* _2 g4 \0 p! y+ ]) a k: O/ q3 n. ?
|