通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
, x) \6 f7 v0 D! U4 ]
# r E! o0 n4 F 0 R1 _: r7 u9 x8 i
& M& N' W, f- m% E
下面将以查询mysql数据库当中user()的第一位为例:
9 J! G" L* E$ X2 l- R5 J9 w7 ~0 Q
6 ~7 m) U9 C" d) h6 o9 o
( c) s. `+ G) |6 R; y+ Y C2 u4 |0 Q' E& c
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)' k4 B- I5 s, _+ @+ m
3 |* Z2 S2 c$ \2 N$ i6 N
! X6 t+ ?( L% ^) e) j5 [
) v1 {2 k& t7 F5 i6 i首先执行如下sql语句:4 O5 M- l# ~) P9 Q$ A- ~' F
2 t7 w+ M v" ~% V, d0 N% Q, q, s
- m' i# @7 N: f; c5 O' y" L) P" |2 ]; D! C- u: z3 ]7 T
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
/ B/ Q! c; a, P' k o5 }0 O; a6 J5 Z% Q0 x/ X7 U) Y
' k9 e* q: I: ^
9 r/ V" v3 H1 v. O我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
* v& e. {" A/ G( e; m1 i$ E) h3 o0 J( d
6 d; x& { z; q& D: H
- x* N4 t4 m( }/ G
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
4 `+ h4 s3 o1 e) r
* P$ ?0 y. O5 k7 l% P* `) H! R 8 ?8 c$ y( ?- L9 i
# K; o& d7 N% O- I: M% E2 {3 [
如果运算结果为1,说明第一位为0,不为1
, M: ?5 X. g7 d% w1 Z: _7 U7 {. q# W; \/ z8 \% }
+ H/ h2 h5 ]' J6 m' ~$ ~
% ?4 G! V+ ?. w: S
+————————————–+
: l5 h& u4 t- K9 y/ j9 O8 S2 \& e( n- r- h- h
| (ascii((substr(user(),1,1))) >> 7)=0 |6 m% X- J* J4 @6 _2 Z
9 c$ N" V- y4 T3 `
+————————————–+
2 H( n" _7 z' \" I, X
) U5 B: c! b& I# ]| 1 |
, R- y" h, P& E
+ y& H" W9 h: r+————————————–+
: U8 B) c+ `2 r6 y
- C9 P5 W* @1 n p% J1 row in set (0.00 sec)
* m8 ~2 t! e$ R# o ]' V. y: G m4 E7 E0 S$ b- C
这样我们就确定这个8bit的ascii的第一位为0. m- ]9 F: P) L; m8 M4 V0 `
4 ^% p1 c% o0 x& f/ g* K- s
; [$ ~4 X! o$ ]7 ?% ~2 t. E& S4 {& t9 `& ?' z5 }$ ^+ D
第二次我们来做6次右偏移来确定前两位/ _9 n7 C! C% M" }8 l s; e) O
6 v* M* q s8 { / K( K. `% l- ?+ N5 C
o% z# r& ^& W( x
前两位可能是01或00,即依然可以与0做比较,
" o# I `% G4 Y% G3 W# O: C5 ]" ]! g1 b5 K7 ^! x7 v6 P
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;/ v# ]+ z/ A. y7 V( j3 I( @
" x. n/ ?( }% u: `( A7 ^
+————————————–+' x6 N* i( h- w( G
+ G, U$ A' h; i1 h. L| (ascii((substr(user(),1,1))) >> 6)=0 |
& ~6 T/ Q( F6 z8 x
1 v' |( O# Q! @: y6 ]+————————————–+
6 n- _5 _9 H; x# f" x! _* P6 N8 |0 s9 u( L4 Q8 ~
| 0 |. \% y8 }4 U; E9 _- I5 l
! {: K* @8 G0 s8 {4 |$ T2 O+————————————–+! Y5 Y8 V& {6 {
* J; G7 q$ a3 m `1 row in set (0.00 sec)4 l. E; [' f4 ?% x4 w9 } m1 @- v
( W% L8 o; a8 t' B" Y
b7 y) H, n" n8 S# _6 e0 Y" S: I# ?4 c( k
结果为0,即第二位为1
. m; X& m! f7 z9 i
; u* [# _4 R& U6 f6 b( c# E
0 Y p i! j( f6 ^( m: j( ]0 s0 F
& Q& u! t7 N |! M! H( m开始猜测前三位为010或0115 ^% V; G, O6 B. z( w5 W
* W$ W- \. A4 x- p& h7 \
- z, K8 ^5 Z4 [. i2 Y. g0 S0 X' ?
$ s: O: g$ T# @% E4 y# p
让我们看看010和011的ascii码是多少6 }5 k: \% b% ^* d6 _0 I3 C. m
# D3 c$ V2 b3 y( g8 P1 Y; m
: B* S! }# |1 m$ O) O8 F' @3 V. A, O5 z. ]) ]* m: @9 g
分别查询select b’011′ select b’010′9 U4 G2 Y' e: \' L6 v
2 `4 m8 e: h' `, s1 I1 D
' x4 M$ M/ ?3 u7 Q" L; F! [" q. l: p, ?1 e* q. k0 h
获得结果 010 = 2 011 = 3
8 {3 v y; w3 r* ?' x
# P9 @: ~: L3 [- } L* e
. U$ K( s& @& ^; X: y }8 Y7 M/ x" q+ @( d6 R! G6 l3 ^
执行如下sql:9 G0 l* y, o5 `/ E
, r& O" Q1 v9 }, I
, {" Y$ r$ U8 @& P
% l+ Q* q) g9 _" h4 Qmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
2 N7 S7 Z- C) U+ s* ?! n
& \; x2 x4 n7 c7 |+————————————–+) M! R! A" C" n9 y2 k; F6 g0 e9 \
; X9 k3 x- D# W. g| (ascii((substr(user(),1,1))) >> 5)=2 |
8 \' ^# i% o8 u$ Y
5 D$ d# ?" E9 P ^- G. ^+————————————–+7 E! Z5 l& j2 o
$ M% v! {9 g( F5 `6 ?2 ?| 0 |
2 v& H: R; {' m+ v* B- w2 G6 t2 n3 M# @( [3 |/ u' C1 n6 ^
+————————————–+
8 C. C, u' \. C: g) T; z3 Z
* c& F, d& O& j0 E; c1 q即前三位不为010,而是011! T7 N8 e% Y0 \4 k1 c/ W0 x' E+ ` x
) W4 [: x _+ H! w; Z% r' B5 P
2 w! C5 L. {7 l0 d2 D' e
0 g- Q. c) b' }直到获得最后一位$ \3 c! B; @4 Y) J# ?+ `
0 S% l& c: {, s* p8 T; k
! z H. }+ F% s3 B% R% `
, C3 w9 \) j3 c' c T最终结果为:01110010
9 ?2 z5 R& ^. ^% {% S
& X) h2 l9 `; L- ]. u9 T
# A3 T. q5 |! l; e+ }( v% m# ^2 X( s9 ?# x9 Q% ^: Q9 L
转换一下:6 j5 q- F- h% g
- \4 d& a% O3 W8 Y$ R- Q6 A3 ^
: L& O b ]1 A: k3 ]' l2 b& @/ |7 R4 }, ~
select b’01110010′
) O! {; @2 r$ Y* o7 N$ }/ ^; ]
9 e3 L+ c9 p0 G9 O L$ A) U1 O0 V W) V$ Z, a% E
查询结果0 F, A! ~9 A9 v+ @. c
- ?7 C" X. s; f" e+ U |. [* z- N
" y* S7 p: _0 J) z3 Q+ f6 N' Y; A; L3 J* A9 q% V) [. P
+————-+
/ D; g+ O+ R' l( d/ F8 y# i. `# P2 x0 ~, ^! H
| b’01110010′ |6 k4 d0 z* O$ U+ a- B
8 S B7 V( R: O+ ]5 f+————-+
9 ]# @0 f1 _9 K" l3 Q3 Y$ {+ b( ?4 Z' x
| r |2 w5 L" b) }0 }: d2 B- M& K
1 J6 G3 K$ U( Y% i# X/ ~- N
+————-+' V3 w3 M9 r2 C
1 a: c' n0 X' s9 d4 l! f1 row in set (0.00 sec)
4 T- i) a% h* Q- a; F8 {
' r- e/ ?5 }2 A# F& L2 R
$ p! r& o3 E _: r
7 n% K' a- @1 ^) U$ H0 b' o! G* G这样我们就获得了user()的第一位.其它位依此类推- N8 G2 U/ ~* d% Q- z
$ _( J' }3 L, p0 w4 e
|