通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位 I4 Q$ d" C7 u6 Z9 c* @& T
1 P% y1 w' T n# g5 i3 K& ^
' W: v/ D% d q3 N
/ c0 {/ K! O6 z2 @, ?下面将以查询mysql数据库当中user()的第一位为例:
; t3 G, ^3 @7 k1 I* ~2 S# y7 |
. y+ G' |+ g6 y
5 P4 h. O; L) q0 c. G/ M. g3 q9 e- J/ M$ P8 v* ~" M, m
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
( q9 t: |# ^3 K9 ~
4 S% z4 a; y+ v2 R" T
7 w5 X/ \* O w4 Z
1 p T0 ?0 z$ m首先执行如下sql语句:
4 e5 }9 X# D$ K" T. |: }7 Z% y
1 S+ j4 d: v6 V7 R3 n7 j# [
/ S! d1 k$ K1 e6 b
7 U2 S( `. @8 _7 j& y- I1 I( Lmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
$ N4 c- U' u& w9 c4 K
* ^9 v) ]. q7 g n; ?6 P 6 {! {" k# o. C( a& y
y) V' k5 b" {9 T% t s我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的% N! y$ \ U% `; B" v' A
0 N$ G, D+ W0 ~* ?- W* c
, [+ Z$ {# D$ s: _& s2 a1 y. I5 b: C* f5 g
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为17 u: F( e0 J2 v/ V% T. A
- f) m. O s) S9 r
' |* n" M1 O$ j3 t$ i Q8 o) ?$ d
: b' }& y8 N5 k8 l2 P如果运算结果为1,说明第一位为0,不为1
+ ?# T4 l) ?& _& p- ~! R8 ~
* r. P7 J6 y$ @: {: B; M
: a3 p6 T% C* v* M" k* s; D& s" s7 j; e1 G2 F$ w
+————————————–+
U* e: W; V1 |& t( h: T8 x h2 i- Z1 f5 w" G7 m4 h; D- b
| (ascii((substr(user(),1,1))) >> 7)=0 |
2 D, l( X* N2 m* N" j; x+ q6 T% }- l$ H
$ Q6 {# c5 P( R. I+————————————–+4 [0 F4 L* ?2 q6 C- Z% {$ T4 r
- z. R ^# S2 T5 @8 f
| 1 |
7 H8 k/ Z7 \5 N+ n$ b7 c
w$ i7 }5 X2 r9 g$ e a+————————————–+8 L8 {( y0 M7 \" r
9 g4 m+ J, Y0 C6 m: n
1 row in set (0.00 sec)/ v' A( c O0 ~) Q% m! W: H
. ~, N, r z2 I' b4 G. |3 n这样我们就确定这个8bit的ascii的第一位为0+ L- l2 U3 V4 ^
0 L/ j$ C2 a6 [( q& j9 y
: F; M7 c. Z$ S+ U; b2 l* r9 A% e/ Z! c: \2 Y
第二次我们来做6次右偏移来确定前两位
3 H1 N m9 C1 J: J4 b' W8 w
% ^) U0 Y7 Z" H8 }
, F: i7 ?# R6 t l# {& X: x& r5 s
前两位可能是01或00,即依然可以与0做比较,
; G1 L. L! D6 o- ~- C% W2 v9 H. i) }; j1 a( Z
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
0 y% n; _7 |+ C0 B+ {8 b5 H6 H( i# N7 v
+————————————–+ j3 O! b/ ^/ ? h) i# O' U% X2 k
4 L2 X2 T+ H5 S3 k' k. a7 m| (ascii((substr(user(),1,1))) >> 6)=0 |
9 g0 t1 E5 P, T4 Z1 H2 ^9 q& ~ P, a7 ~1 e/ S6 Q3 x4 J" R9 x
+————————————–+7 S! |) R7 Q2 j' c
8 o7 ?) I$ e5 N$ B
| 0 |8 O$ O& A/ L0 j7 C+ i4 g, G3 N2 N; n: c
1 v" ~9 |/ ]4 P% d+————————————–+2 `& j. b$ E4 g
0 {, v: O! U9 |, p1 [2 V1 row in set (0.00 sec)0 L. [$ _$ O* D% {" B. m
+ L' ~7 i H. s% p
$ w$ A9 ?! C* q U5 D0 Z$ R) U& R% J9 d; v0 X3 p# O$ ^) b
结果为0,即第二位为1# I. s1 X2 h* P" T% n4 A* ?
- @) o5 T4 N/ n
1 b0 q3 R1 U0 I) A0 }
0 o1 \# d! Z( D1 {开始猜测前三位为010或011" ^7 N0 J6 r; I8 y2 S
( e! H& b, t$ |* |- X5 Z; h" ]5 z/ W % Y+ G( f: s# p5 k- o
m- B0 L5 u% n+ n
让我们看看010和011的ascii码是多少
4 C- }' O$ Y& C4 o8 l |) e' v
+ v) m9 ^$ Q6 y u" k" u! s
/ V( |; X. z$ h7 G- P4 m# \* j# O
2 N" {% \5 | |9 u0 ]! B分别查询select b’011′ select b’010′
, f, J( w. x; \+ t# C# G$ N. u3 n
6 n$ A! J8 [' r/ ^
% t' h5 h* Z9 o3 C
8 S+ j0 y) b! _7 w3 `* X获得结果 010 = 2 011 = 3$ n7 [- x5 E6 b0 ~0 l3 Q: @4 v' f
! }" W: J: k9 B+ H, g5 Z0 t # W8 x. Y! ?$ E) H0 v y
& l9 X# |& I) x! U3 [0 b
执行如下sql:* }" H% _4 j1 l/ i
' z- t1 E+ A- }& o$ z/ f) q+ L
+ H' q2 B, c2 k; @
% g; {2 U* f4 J/ y( m. gmysql> select (ascii((substr(user(),1,1))) >> 5)=2;3 n* y! N' ^+ W/ D5 j
' I% ^! C5 l) c' X
+————————————–+& t% [* V. O: V6 j' ^$ I. A
! W9 B) [, |8 p' g3 g
| (ascii((substr(user(),1,1))) >> 5)=2 |8 W1 ]6 w6 r: j* d
7 u8 l7 s6 i- q0 |
+————————————–+
6 c- p& |) m3 j M9 D6 t
' j/ H6 i: A4 U/ k& y$ S/ u| 0 |# X- s& x5 S7 ~ C4 g5 Q! U
4 _* u& N, y) l; G
+————————————–+% Y6 A" G2 c! e0 J) H
$ Y" h9 Y" N6 i7 z) |即前三位不为010,而是011& |) G9 D% O3 k% r/ a
/ c7 r, P, o+ d
; H, c8 ^$ @. {: a9 F2 ]
8 a- f' H8 I* s" s- `# W- B& Y直到获得最后一位3 ]+ ~& w1 D* @0 |0 |
7 Z6 T. H" [/ H
Y8 ~- x M- D8 q5 A: p% }1 T: B5 C; W. h5 P) G; h" H) ]
最终结果为:011100109 u* x+ ?9 U" K9 w8 N
l; G3 V, q2 z# L6 @" O
* S2 q- G3 \# [: w0 M) S! F
5 B) [0 B' M/ F- T% G( W转换一下:
' u) x; E, \+ }- {5 F; X
! E( N7 J& q6 L2 N
^$ p6 J5 q N, s
9 ~8 \/ h8 [# M8 ?# C" Pselect b’01110010′& Y' c& Z) a3 o0 J8 N
" ~' j; B' {: d/ D
% t0 e$ L5 c. N2 H0 l1 w& V
`, F5 t$ l$ v& P/ S' H
查询结果
# H& G, `/ S, l
; @ Z" v) G+ T8 V
0 _1 k2 a7 f) R" Y8 }( Y' H
b' z5 q: P' g' a/ k+————-+
, o0 N: ]' P* Z$ t# |& E! a
% ~0 W$ q# G; v" U| b’01110010′ |
6 f; ]2 Q5 N5 k" v
V+ ^& V3 a% c; \; ^- f. D, U1 [+————-+
7 n8 [1 k6 a& r$ L9 z7 m w, V! V& Q* e8 x6 @4 F
| r |% Q" m9 I; w* ~# Y6 f6 f, v3 ^
# F/ V0 h9 K( [" G6 s# _2 D& Z+————-+* m Y' ?* Z ?
( G+ `, h6 Q2 ]+ a, x; K4 C1 row in set (0.00 sec)4 B; I3 [$ f+ O& |8 {! n: a, q
9 U. v0 l' P5 N7 ? 3 N6 X0 F$ C2 O: N5 i9 ]
, j2 H1 _0 B7 \5 n U
这样我们就获得了user()的第一位.其它位依此类推
1 r; m) ^. ]+ W+ T z2 ?) p2 Z6 q" F& q7 V+ h! D6 w* D+ ~
|