通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位4 u& @$ ]4 H1 g1 }
8 x1 q; w3 z0 J( g+ r
9 \& B; i+ z% D8 ~$ X1 O, b
* [( b8 j: Q. a+ ^+ h6 o
下面将以查询mysql数据库当中user()的第一位为例:
u; m' `7 h+ n8 W$ P. ]
4 U' M5 G4 w! s; e # P6 [5 {" b2 Y1 j2 ~
1 \% e& e& d* H1 Fps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
! J; w! v" U4 x7 ~! s6 |
# h* y' }6 s+ |; w+ y1 i
6 L$ N3 H- a- \" p: U9 L
9 I3 c. s6 L& K: e首先执行如下sql语句:
: K7 K; j1 `! p+ `' ~1 l# e8 M `& W9 R6 B4 T8 o8 l3 S
* C" Z( p8 S3 R* e
4 x- u& e# X. d) ]7 n1 imysql> select (ascii((substr(user(),1,1))) >> 7)=0;
8 L) X" F- E$ W% k4 x: X- ]9 l
% `( p* K# S2 G* c4 | ! J% `) p) Y" Q0 B5 |1 Y% G! J
% W) ]# Q0 d3 \5 k9 a5 b5 ^
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的, x4 m& u. H5 ?% @
: X- E5 i2 Q# X
$ e5 x% h" |7 A, A
+ P. I' k x4 d/ q; ~第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为19 Z. h8 h2 N9 n3 r b( J
( K, G( P9 a; p z/ d ]4 u
5 v" m* o/ A* q8 l
7 W j. W: O, C4 D* L如果运算结果为1,说明第一位为0,不为1. \& L5 l/ R% |4 B, ]$ V1 l
4 [5 l$ ]) V9 H, l/ C
4 ?7 e3 H4 _$ R' v* d9 k$ k$ K+ W5 v8 J/ N& O) }
+————————————–+! j+ P' v2 ^5 c1 e
" f! X4 M" q7 }) h0 `1 K
| (ascii((substr(user(),1,1))) >> 7)=0 |' ]4 B- k4 n. k/ G0 s* d+ t+ h& h
1 |, v& i$ G' X% {) A3 Q2 K+————————————–+
& X1 b7 X& W, _! v$ {) Q, K5 X7 H, W P0 A
| 1 |% m. e& z, {" N
" ~6 \ o0 v# ?3 l1 P N
+————————————–+ |. N( f3 ]- ~, S
+ u# t i% I8 h: o, b5 R; ^* K6 @1 row in set (0.00 sec)1 t# _# ^ F2 C
: F* i! o0 V) [这样我们就确定这个8bit的ascii的第一位为00 @: d% c3 z6 J E/ T4 o
- j0 v4 Y% H3 u/ p3 `6 w/ m! k
) X: x# y2 H/ f7 H$ j
O- p: b0 X {% ]3 E' a" k9 g第二次我们来做6次右偏移来确定前两位+ @& G+ x, \; b7 q: r
8 G; F( D! A) j' O6 l8 I9 X
8 J% s- q! s K! L6 z; o" p& R7 U, o8 @: v0 g
前两位可能是01或00,即依然可以与0做比较,
# Z6 J0 |9 v! |0 f8 F
) b! K5 a4 K6 Z- U- j" J# omysql> select (ascii((substr(user(),1,1))) >> 6)=0;
- k6 g0 i' E# U5 X$ z( A! t m0 F8 j6 {3 m1 s
+————————————–+2 Q6 w: q+ |4 {2 v
) x' q9 p' Z, A# c- w% j) U/ m| (ascii((substr(user(),1,1))) >> 6)=0 |# x" f" ?* n, t
, K- h/ A6 L$ j# v0 G" m. z
+————————————–+
+ \; |* g; f8 _' \3 |8 o0 y4 f* w9 j8 s3 q
| 0 |5 B+ O' t7 s. Q2 t' T
' W& p! ^6 ~0 E6 t' v! C; z, q
+————————————–+
+ r6 Z T y& n2 ~) }. V; n- n/ s/ Z& Q# s+ f( o
1 row in set (0.00 sec)
7 {5 |1 T+ [" M$ j; b; M
9 r) Z; R) l t) S- q; T3 c+ x8 ^: H % o! l% m8 H8 k- D/ B" S. w. n
3 C# [' `6 G% a/ B) g
结果为0,即第二位为1( m4 N$ t# v. e+ V
" |, h# ?7 S6 U) S, Z, m& i
+ u R& b. {& \# J
( n8 U* k V3 Y' c* D. n* A/ R
开始猜测前三位为010或011
1 j2 \& e8 d0 S+ Q# b/ N2 g7 ? f. K) V! N8 E4 \; C- ], R
) I' x4 f3 |6 H- v6 S3 y* C! S3 [+ ?1 \" @& Z6 T
让我们看看010和011的ascii码是多少
2 I0 V9 }2 N; y( m [2 S: R8 W2 t4 y2 J( W g3 N. ^
5 p$ O: z$ C3 J- A- t3 A2 k" Q& J& d( N# C6 u
分别查询select b’011′ select b’010′
/ [+ \1 Y% w9 p* I
a% b7 X. x( e$ `: R 8 u2 p+ X n4 R& m# g; J1 t
2 P/ s$ G' d$ [* t' L3 E& ], {8 C1 u
获得结果 010 = 2 011 = 3' K) [* a1 ^0 a+ T( |8 H
- U q6 F2 E. d6 u( Y+ g0 a$ \ % ^! [1 ^8 M6 ^+ e8 H# b$ }
5 ]4 K% S b( q执行如下sql:$ A" m: W& N7 d, M6 f+ @8 Q# @4 a
4 J8 M. g8 S8 {
+ B5 u6 Q0 c- @0 c' g2 ~
2 U- w8 n& a5 z1 `mysql> select (ascii((substr(user(),1,1))) >> 5)=2;. p' y6 ?( E1 ^3 l, J4 k' ^
/ @+ l5 A1 C) o+ }; }, c) i$ B+————————————–+' x' d$ Q* Y2 D% j' B! d
) ]# h: A2 h A9 S' \3 b# j
| (ascii((substr(user(),1,1))) >> 5)=2 |
$ g- Q1 f/ N! S# N1 T4 {6 v6 V! _& [: R, M, u
+————————————–+
. _; ^7 j3 H: a6 ~, D1 h# W6 {% p9 `' }2 S2 D
| 0 |- A* S6 z1 u' z3 z# d, o6 s% @$ p
* j) s7 `. I+ m
+————————————–+
8 V! j/ E6 ]8 V; L5 I2 t2 U
3 ^% c( I5 V4 I9 }5 W4 E, x& w% A即前三位不为010,而是011
- B; E9 M r5 r3 r; I$ W% Z& ]# p1 a' B! [5 A7 g9 M
2 L3 R3 H% Q" s# Y w! y! ^: ^- K& E- o# R4 Z" h0 W
直到获得最后一位/ Y- q! t9 m- q5 e
* o: F3 J9 Q4 B$ {+ I C G q' |" e% a. v o
+ F6 q+ p/ Y& q1 z8 p, b& g最终结果为:01110010
; b q* Y# H* _1 U
0 N) P& _! v1 b% t8 a: Q 3 H* n6 {9 n( a& \5 ]. L7 k& D! y
* R% P, y0 h5 O7 l+ L转换一下:
% s0 b2 b/ h0 k5 {
. y$ ~' f5 v; F A& X 3 W! r0 h: b. o. T
7 v, G# a& v, N5 G# w
select b’01110010′
" S7 P; y- B; V
0 _8 N; K. [- H# n1 n
5 E2 r+ |# l) }8 ?6 r$ L/ d4 g3 `' U& j
查询结果' [5 B& w9 H; @# B. D
3 y2 f" Z) p _4 ^; N' S# z: Y, H: | : \5 a* R* j* B# M* R; B% t' K" n
) d3 c+ m! @: m6 u1 f3 _: R. c
+————-+
& l5 G: Q5 F/ S( N; Y' t; t3 @/ m, @! Y" ~3 A5 Z( r- Z
| b’01110010′ |# X; s Z% r* A* L$ `3 }3 C4 V
- X8 Y8 K3 w3 s# M, K( \/ J+————-+
1 Y1 n5 l9 ?3 L6 [4 o5 E& }: M0 R5 \
| r |# ]% c3 F1 j2 F& x/ e
' m/ _7 s1 r, d v( p; }1 X5 e
+————-+
' F5 T" x8 ^7 _# T8 N7 x. u
0 A/ D( u; J1 e* i p4 O& Q1 row in set (0.00 sec)! D/ i! [" B% T4 U% E( x3 A3 u
6 O/ M8 e( x. T) |
) `" X$ j n; q* I" O! V1 Z, E+ x
这样我们就获得了user()的第一位.其它位依此类推
' m5 Z8 ]' h1 y& d/ T
. H, S4 G: ^- T+ | j. e |