通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位$ e: U5 W5 l! H3 b5 K6 j6 ~
$ p& e8 k4 r5 S% v" Z1 T D; ` 9 s7 A* H+ {- G9 {* a
" [( J1 W, J" Z$ q# a& j- l
下面将以查询mysql数据库当中user()的第一位为例:
) }; ?7 X" B. v) e4 m/ |1 s/ p6 _2 O4 s; C
( o- E3 V/ X1 I& M! F/ @4 r! `' o1 l2 _- t. K
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)2 u% P" B! m9 _% m
9 {5 E( D7 ?& w/ p
. `3 [9 P) D9 ^7 d; |
! y0 B5 a+ M+ h' [0 h首先执行如下sql语句:6 H) h1 d& r( e: y+ |/ `( k
: ~# N6 I, i& F& z7 N- t& Z
) U% f* S0 M- |' f: ?
9 M. ?' _- E5 o8 e1 F. Pmysql> select (ascii((substr(user(),1,1))) >> 7)=0;& ~# [3 M0 U6 c& W% U- T
b, | R8 T( P t, g" q& m
" D0 M5 v0 I9 R8 I4 S5 p: {1 ]% N8 r+ \9 W; N( t- H5 N
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的% x3 m5 L7 y- k0 V2 A
% f" R& W; l4 Z2 p1 |& a
) r6 p0 t& ], l$ F
5 ^/ D6 N" \" e. M+ L6 D6 h
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1; @2 U) P+ w1 A8 `$ r
% Z, {" O5 p! Q
* a8 a) R+ A. O; m# n
' M! A& O* V# @: J2 t/ L如果运算结果为1,说明第一位为0,不为17 g6 W1 }: C0 o. J L# P, P, b( P
6 n; D; d6 a' U1 Q' d: B
. l# B' {2 v4 f* F3 @3 ^
6 I, Q6 w3 ~/ r+————————————–+
* w* r+ s, U. i- _0 ?/ i1 |6 b# X
; `0 ~8 l) ^6 J1 ]2 t! u! i% z| (ascii((substr(user(),1,1))) >> 7)=0 |
! \# @9 z* Z& A8 Q; N! N2 |( \
+————————————–+
7 u# h( ~2 x: N3 L2 U8 J# F
, S: }3 s. q' a1 X" W| 1 |$ S& V: R# b) z1 @+ Q
& a' A; `; z$ T3 H+————————————–+
7 Y. E) y* x3 R$ Q1 f$ L. o4 R
5 @5 N- S$ e' Y6 p1 row in set (0.00 sec)2 D3 t6 r8 ~* ?9 d0 i
& l& p- I* P7 A& e% H( H0 G# e这样我们就确定这个8bit的ascii的第一位为0
+ c% J& `0 E1 \
* k/ v( }0 C2 v& K A, e V* t5 r- f' _ j; V5 {
0 j6 \3 p; p$ E/ f, v第二次我们来做6次右偏移来确定前两位
" v# q4 H% S2 ]$ U! d6 L9 O" c+ i5 E7 `) t
3 d: i6 q- M3 }& C
9 r% c- N4 e0 U2 Z前两位可能是01或00,即依然可以与0做比较,
' I+ r% U& L+ z; j# y! x/ |4 H9 Y, J6 t x
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
# Y' U* I' i* r" d+ t, V' C, W" n
+————————————–+. V- v" M& J; r! X2 ^1 l) |
1 g$ Q7 Y: E/ Z6 Y- b2 g
| (ascii((substr(user(),1,1))) >> 6)=0 |
# W# Z, u; }- O7 K U" r9 c# j. H( X2 T5 S8 j; Q
+————————————–+
. T9 h0 }" [6 D' M; l1 l* N) @6 Q- k, D+ E6 s
| 0 |
! Y6 ~5 g* @$ Q" K- a% O( h8 ~0 {0 N r* n( F+ |: u( R+ X+ i3 a
+————————————–+
- g( p) {; \: M
( @* H7 r. q9 n1 z4 f% j9 x8 f! P4 B, `1 row in set (0.00 sec)+ a5 o, r5 s* j" T* ?
6 u, Q; ~; g4 G* G1 ^( M
3 w ?+ [( B) [+ z* C! t' i2 Y
1 u5 X9 Z' V6 r& R& V
结果为0,即第二位为1
& O9 X" ]3 V, p; H, D3 M$ [% i
7 T. s, m# U, F# W7 W {8 S / H8 U! s9 u; G; J
2 ^5 a( A# P0 C1 q8 Q" S开始猜测前三位为010或011$ W( ^6 x) ^# i- K
! V+ J1 u5 B& e6 M( C7 D
9 H1 B1 X% e/ m; W8 p$ A
6 l1 b- a z$ E让我们看看010和011的ascii码是多少& Q" M0 Q' F) M5 @* R
: J, \6 }1 L' ^
5 r" {8 r5 R0 V7 H0 L
% J' g" ]) n8 d8 ]分别查询select b’011′ select b’010′
+ |# l3 J* R6 E* K }; [; J: _( B0 w7 L: f& e, ~$ a
% L0 p% N; M1 `
; o0 r( j" l: \* n- R( N获得结果 010 = 2 011 = 30 z r! W( [) d- j# f: Z7 E% d% ^
5 t3 H' G# i' @( `2 ]
5 s# Z3 }. T; E6 v$ A
$ J2 { k7 Q) a8 M执行如下sql:% R# C! O& l0 y/ ^; k+ D9 i* x
r3 _: ~/ u* b0 U
6 }3 V; ^- f4 l. b
( ?% c; K0 E0 J6 B
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;' J! F7 D( i2 D2 `" ], Y
4 A! }$ H/ }& N+————————————–+' Z4 j# T" Q# [( j
# a+ `0 b3 w0 T' A1 G| (ascii((substr(user(),1,1))) >> 5)=2 |1 U& W8 W& Q' P8 b$ S* B
2 m! ~" d% e0 b) v2 ~
+————————————–+- _$ V$ K( h' ?* W
& A9 v# @8 `9 r0 Y. a
| 0 |0 l% i) o( W8 s
6 x" v9 `0 ~, d! [& j6 r3 q+————————————–+
" o/ l7 [9 A, H( A K) z" I a3 E
' z5 o% C- X2 r* { m即前三位不为010,而是0119 r4 U% g7 W- l: Y4 K( }8 m
`- Y& q; j$ a# ^7 R" S
. ]: t9 _9 T) L
7 \% V5 R1 ? }5 Y8 t( ?直到获得最后一位
# d; ^8 }- A3 p5 Z! ~, ^$ u3 a9 i3 n7 B) I* ^
& V& G3 d- M& y$ p5 P! N! |( [" z
% c+ l1 k3 p& e2 Q {1 F最终结果为:01110010
! z. S* C( s$ E; v( b9 M5 n ^; K. {; n) h. |, m! c3 u+ t
! C) Q3 A1 c+ d. e' d/ F7 h+ ~
3 Y, h/ B7 X, A% A, N: L+ N
转换一下:- }7 w. P; I2 l t7 X5 ^
8 d" d8 C! W# A$ Y5 j
4 z7 p0 s; |" H: h4 h, _' R5 w+ Y- u8 h) I9 |' I1 ]3 s5 D
select b’01110010′1 a* O/ Y6 ]; A# @ S( O5 E3 i
6 j& A# r$ O* A' ]0 @
) d: N; r' [ |! {8 Q0 N% i( k0 G) I1 q H( Z2 F0 h; J
查询结果
: H$ _4 h6 S! r8 U. ]1 l1 M$ B# H/ v" x$ _! S8 }- r+ }4 `2 }
2 Z" @/ l8 \( F& W
3 }, k% d6 `3 M. a( ]& V0 Z- D4 e
+————-+
3 _9 Y& |% K( L4 X5 o. o* e! O/ Y- f; Q" F
| b’01110010′ |
/ V6 `& Z5 z+ {0 P: W8 |5 [+ n6 x3 P! a& d8 S5 i m
+————-+% G7 H; L* J9 l, F1 M5 @$ s6 e& v/ a
: G; G2 y9 D4 ]
| r |/ E9 a- L2 r- d6 V" B+ _) J
) V8 ~9 ]: F% V
+————-+
1 d0 I1 c$ v" c* r6 R* }# C i) b: Y# {) l q' J
1 row in set (0.00 sec)
1 R& s- h ?9 y& M) X: v$ K
A: w- W+ @' O h8 [ 7 A/ E3 d8 V% i! L& p6 J( d
9 ^' h. U' W& i, c0 s U3 Y
这样我们就获得了user()的第一位.其它位依此类推
: @9 r; s) d% {
4 v- @' Y" ?/ b |