通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
3 b4 I; Y! N: q: K5 T, w" C0 e2 N) }
+ N' |7 `8 L( u" h
" r9 _. |: j4 g$ d9 I下面将以查询mysql数据库当中user()的第一位为例:
, R2 l) }8 h8 F" `; `( N
" d3 K2 e; E3 k5 a 9 ?9 ~$ ?6 X" r$ `, ]4 R3 H1 u3 m
9 a. b0 D6 z. x7 e# M
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1), ?/ H( o/ d4 T7 m
6 {( z' j: f# S* m# P u
# A3 `: `3 q' g) V$ N6 z" _( ?/ K+ x9 q) O$ B% m1 R) V
首先执行如下sql语句:5 F- q1 _( |; y8 [+ F
. T& G) Q6 H( M! I# q V
; K# E5 h! e/ }: F0 d
. I& Z. f Z1 E' x2 imysql> select (ascii((substr(user(),1,1))) >> 7)=0;$ i0 K+ q# _0 B4 o1 t+ Z
( h# J0 R* @) D
. i' t5 ?6 v3 t. k; q. X. J0 v p2 G* p$ b% ^" F/ U
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
! }/ r1 K. v9 R9 l. K/ \) j% q- ]* E! `# v) G
# @" ^; _/ v" [5 Z. w; F/ W" \
7 P% U" O0 ^& e" d* q: d第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
4 S! v6 ?, {( v9 v" N! w9 d; z7 A) m0 Q2 |; Y( s
q3 P8 Q S8 Q. s7 i
0 V: ^3 I* g! O如果运算结果为1,说明第一位为0,不为1, W, ~4 J2 D1 G9 j6 ]
: l- @: F) b9 x2 r0 }( k3 m
7 H/ K; [# C2 Z6 A
8 L# C) u( J0 L, @2 Y: r+ A+————————————–+
* {) P4 ^/ L7 N2 _& H- v' Q8 Z. E) Y; y) e0 p+ x' f
| (ascii((substr(user(),1,1))) >> 7)=0 |" W5 }) G& _8 Q9 \
! k$ S: D+ Q# s7 f; X2 m+————————————–+% K# T! t; a6 P1 I0 d5 |
+ O; N; `+ l) g+ q. f
| 1 |
& `- X t( C& ]( m
: ?% h% m: y% l/ ~) v* P- X+————————————–+
9 e5 h* { J4 ~5 K; }& X/ F7 ^) J; T8 I3 g J& T
1 row in set (0.00 sec)! S1 s9 F( _: H. }) A O) ?/ ?
5 O* z2 z* _$ X; u. ?$ j b/ [0 k这样我们就确定这个8bit的ascii的第一位为0: z7 H3 P% J& m: J$ Y+ w
5 m& @2 Q: |& G' R$ k; n, {
) L6 W( D/ n9 R' {! A6 _* Y. b
; v1 q* i6 i9 L7 R
第二次我们来做6次右偏移来确定前两位
2 g* F$ i0 j, a9 ]0 A& w2 k
7 X9 ^8 l- F( q1 s7 h- G# U! R % C5 G, q+ X+ ? w
# S, p9 A+ e, t/ t/ E5 L X
前两位可能是01或00,即依然可以与0做比较,; y1 V6 u6 A" N1 r
, ^" Z" B R9 v. ?5 f) i1 Z1 b
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
# C# f, P, H' X9 r8 p+ c+ }
2 `; r+ e+ W1 P6 @- f4 \+————————————–+9 T- P( X& z" d2 `
[! t$ v$ R+ S/ {$ P| (ascii((substr(user(),1,1))) >> 6)=0 |
$ G ]# {" t$ u, Q. R: f
: V7 a+ {9 m4 w% D& _+————————————–+! v; ^1 N* y6 R& T
/ A) H1 n7 Z) S7 J" I" O+ ?| 0 |
8 o& @' i7 w+ r8 v: o) T
- K" Y1 K' R' S8 l& h6 j+————————————–+, Z4 c2 U7 s8 W0 \8 }& X: E& J
S' v y. S( M- O1 row in set (0.00 sec)# A; u1 k- n- _8 t& ?: j
) }7 _ p) k5 d ; @8 {8 P, b& z
) U6 f! ]4 K* a" C6 N/ a结果为0,即第二位为1
6 |4 r, _" [& O
$ h" G) B: \) ]8 j' m 7 W, {4 e7 V' t8 s+ Y9 n
% i* ]! {9 h" k7 s7 O
开始猜测前三位为010或0113 }+ \# u% d+ p9 j b
6 Q. ^% [. |, k- q( a
+ ~& m# d! [) S. W: {* Y: H$ F5 i: N% D8 |' u* |) l7 G1 Q
让我们看看010和011的ascii码是多少
4 m! a1 F# j/ i# P. K- ^2 r2 b2 y4 w! X) x+ g9 j+ @. k4 L
$ Q4 s( D0 O5 f c6 l3 O! D! ]$ `% |) b0 j7 ^/ B& C9 q+ v6 D
分别查询select b’011′ select b’010′, d: s+ `, M1 L( X
* S! A+ K2 B& |) u# K% n+ M* l
* Q7 O! W2 z# Y- }6 ]% @$ [9 \! |1 y$ s0 K4 i2 ~- Y0 O+ _7 \
获得结果 010 = 2 011 = 3& ?. h2 J4 e1 X1 r$ Z/ v& J
, d+ \8 B/ ^/ J% Y$ r6 i, Q
0 H# ~6 t, O# V g+ s
# j, g8 f8 s( m. i; k( M X1 a0 ]
执行如下sql:
# E2 p' c( {0 ?2 L& k' u
, H5 v6 n7 x0 B6 g* e
2 o E) b3 j8 A' n8 \ i; d1 l1 L: I# @! F0 x3 P* k
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;3 `+ N, t' l" Z' G0 j2 k
- u9 ]; z: ~( g, U4 Y
+————————————–+
- ^5 o! {$ T1 K2 [- I; ^) ?
( H7 O0 `* P& Y| (ascii((substr(user(),1,1))) >> 5)=2 |
4 H c' Q3 m( @: {$ _; u
& \& t9 s" U: {; C3 [+————————————–+- l; H4 H2 X) B& M8 R
1 T' R1 j4 p# G' E. p
| 0 |
' M4 P, X% U4 ?: J9 q v$ }6 @ C8 x, L$ u" ?" H7 D
+————————————–+
~- @* j2 u( k0 U5 l; J: p
) F1 P- _. b/ S/ W) m4 a7 s0 m' P即前三位不为010,而是011% {+ h& |2 t# S: V6 }) b$ z
$ v! v% I% i: ^8 C0 b; \
) D( ]1 E" o# x; P+ |) {+ T( t; T6 c
- k5 y& _" j x8 R, t- H, k直到获得最后一位
1 l+ z6 V) E5 r2 P& v2 t. b- W2 C2 q* k" O4 `' Z9 @( v, }
: w) V' }: H7 T
, R# \3 d7 n; q8 \ P, C3 E最终结果为:01110010 @1 \2 C7 A( t# m2 j
0 Y. g9 y5 I$ A
+ G D4 @% E" a. D: q9 K. O5 [; _/ W0 ]
转换一下:
2 F v" q( L3 u: m4 G
9 _$ J$ @, H/ W$ a E$ {: J ) |; r( V4 |* `
4 ^, @) ~9 W0 Y- w* B/ k" m
select b’01110010′
3 d! Z. u3 i; o: E
" m1 | s% i; a0 H
& v9 y: P' H3 b: B5 s- }/ F0 A" Y/ Z1 i
查询结果+ X( a$ P. c, N8 S5 u
D5 R# q! ?- T2 Q5 V9 M
$ X4 k+ H( A4 D r% X3 I
& S6 P: {: F! I8 S" l+————-+4 ]5 \- t# g' D* F1 H' D! p( R1 |
& Z& |0 b# n( N5 b, j$ _| b’01110010′ |
6 h: f0 X; t4 }1 E- I C
7 V, j$ f G' i+————-+# H0 ~. r! {' W6 z" [7 f; S, l
f" H$ U2 w, g8 P6 \
| r |, I, a' M" ?- e: Q5 B% P# Y
" ^' a0 d* p, Y; _- ]0 O+————-+
" u* W/ h r: y% Q3 n' H+ N! X! T1 s; [
1 row in set (0.00 sec)
% \% o- |/ Q9 ~. n
* ]! `, E9 T+ p( H7 o, | & i S; }" o& x
" ?. {' d6 y) A( R这样我们就获得了user()的第一位.其它位依此类推
, N4 {8 c5 ~. `) [: @* G( w
9 ^! H5 v9 ]3 a) h9 x' i |