通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位- y" M6 E% C, `/ D) ^: k
9 ~+ x* G+ J: J
6 r. ?+ t- O1 Z* v
: m' {' M. u$ a( B% J% e下面将以查询mysql数据库当中user()的第一位为例:
0 i- b* O! j/ X+ g5 M/ Z# T/ `! p9 @# k
9 B3 B7 @2 F2 D$ z* ?7 w3 L: A* \! j3 H0 Y1 `. D
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
, ^! ^4 e% F J9 x
% D$ V, A+ J5 W2 t ! P( Z0 h* U- O& g
: X. Z- k- V% X$ s( U+ B
首先执行如下sql语句:/ w( ~* E& O5 O# B' W8 b% [+ a9 ^
9 I/ r4 o) G1 M0 _4 U
. Q+ O% U" l1 ~- n9 b/ K5 f0 u9 a. ?0 [
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
6 p1 x' q o2 n% z+ }$ _9 M+ u; A" t- h$ ]1 `# u
t/ D' D8 B) x+ I
) Z$ R4 }( @# K% `4 j( {8 C6 y! v我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的* D7 G9 Q% @3 y% o
4 m) k2 e8 B) P; w
6 k1 ?* v0 \ D- G V4 [$ h2 q$ {/ q' ^0 I; R
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
/ t. B; h4 z( G9 F0 I H
8 F- v; `5 m5 p6 ~
. G$ I) }( J# d: S9 {2 z% f5 W) W# m
如果运算结果为1,说明第一位为0,不为1! C$ n) K- k2 k! l
+ H+ H. L' q6 i9 ]0 w: c
2 M6 N3 S5 C; \, M- V/ t) M5 Q! _, Q5 @
+————————————–+
n/ M7 U7 G1 P% F* V: @' P/ o! J: _2 `+ D Z0 H3 j D
| (ascii((substr(user(),1,1))) >> 7)=0 |
% O+ Z$ Y2 {0 N" a) e! D
w, S7 Z2 r2 Y+————————————–+
4 H8 [+ N- P. d( M( J: ?
1 U5 s/ v" o* `/ X# x+ N| 1 |, ^) W& a7 E6 w
% L0 Z9 m" a/ O+ ~, s+————————————–+
5 x! `, s% q2 i" p- I
$ m0 R$ r$ E# @) ?9 }$ O1 row in set (0.00 sec)* Z, I: @+ Q+ B3 d
0 w; H+ H2 N( s1 g/ F3 p }- ^
这样我们就确定这个8bit的ascii的第一位为0
! s' H* M8 E% B, U9 H; A" f7 s1 m5 Q) u: j: V! L: `: t1 u. a
. G& @! I5 Z5 o ]# U$ o9 `* K% E) w+ [! a7 ]+ {1 C" y; W Q
第二次我们来做6次右偏移来确定前两位+ p. C9 e+ N" f- b4 e9 {. G
- M) ` v6 o) p* k6 _. s/ ?3 |
; t- ~8 _4 T) {. l" j* P! W0 k5 N, {3 C; |8 E5 k; q
前两位可能是01或00,即依然可以与0做比较,$ c2 _9 a: `" W7 c1 i% B
5 q0 s" M9 m% f
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;$ n* O! c9 m; v& }7 _% L
4 w z4 U6 X6 T! N r# |( Q% ]$ y
+————————————–+
0 h6 Q4 x! v8 H( j+ k) Z K$ F) k+ k- q8 Q
| (ascii((substr(user(),1,1))) >> 6)=0 |. c0 r8 {2 c( s! @ `; M8 t
' Q, x% P2 @ K+————————————–+ P/ |+ {' ^) k$ k9 j
7 K- A/ U2 @, G2 `| 0 |
9 f6 K3 i0 L! G4 J* l) T: x4 I+ D- X1 c2 R
+————————————–+
' g. ]# X/ W4 @
3 Q4 {8 E4 k' P) [9 d" @! G, r. ]1 row in set (0.00 sec)/ q( R3 r) V! i) I4 d W8 k% ?- t
! s4 I! h: D, ]. L 1 M" M# e6 M/ E8 j6 ]6 M( @: q
2 _2 U( @8 u" E" v7 `9 n: f) G @8 i( x
结果为0,即第二位为1
- |9 s8 ?- \! t" O5 m ]& M( j
6 Y v% i& M* [' `! i
6 m" T n* b7 N3 ?% h) j7 [* N0 a% w1 ?; B
开始猜测前三位为010或011, L1 T, x4 a [& }) Z$ ?0 W
* T7 D$ t$ V- W/ r9 V8 |
- F: g: y& e, Y* Q( U
0 y n2 L- ~9 F/ X$ L让我们看看010和011的ascii码是多少* z0 A: Y: z N* ^3 f* v
7 U' {& V* `0 l
7 m* v: Y$ Z" [+ G
+ `- }+ l& J5 @* P分别查询select b’011′ select b’010′ {6 }. o5 G' j; e! e5 ?
' d! _4 c7 C! N) V5 g) t2 a ) a8 q& I! v, _. M9 u" r5 |# N/ V8 |
2 l: x. E- J) I( _
获得结果 010 = 2 011 = 39 {/ k: a1 Z3 L, Z( ^" e
- K" x) {& z) }+ s1 Y) [
1 _' s& W. V5 s* T8 F5 J( n
$ e) L5 p2 t; Y l执行如下sql:' |. E& l) ^, t3 g/ T! H1 w p: t
6 Q. ^' D) w6 }3 L- ?9 ^1 u0 A3 v ) j! s4 c# w( I' I
F- ?$ c) F) i K
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;% Q) M3 X7 R! p$ V6 u# Z1 V. R
# y0 x9 V Q! [! N% n+————————————–+
$ k0 Q# m a3 g) F: O1 D+ B- W$ t9 x5 L: ^ B6 V) f1 v
| (ascii((substr(user(),1,1))) >> 5)=2 |
( Q. I! T3 q" C9 \+ o8 c! W0 [0 c0 q2 G" o- l/ }
+————————————–+
" K: Y+ w9 S, l+ t5 p9 K! g
6 v2 _$ M! k1 n% l# F2 j3 i9 w3 n| 0 |
* p( e+ \. @. n, q8 }6 {- x. p: y* x
+————————————–+
- ^7 Z% P: f7 M, n% K8 |
' m# D% ]' `) u0 J. F6 Z4 J, s即前三位不为010,而是0112 h9 F: S: a& S. ^- E- z
, a; s% O. n& f9 U : W0 T% ~4 @+ L6 Y8 }8 P
9 ~! o6 A2 [ P
直到获得最后一位$ m: t- H; w. q4 @ l+ N
: R" e! l) _7 S. S5 ` r% n
% [; |& F# v' b
: k0 Y6 C* Y- B5 M2 J% _+ t最终结果为:01110010
/ z6 `; z: v7 o }- l3 i, ]; w+ m3 {$ j8 p( I. S
4 |& W, k g' x, y' e/ T5 F3 W( ?; l: g9 W- }
转换一下: G; p n/ K# T
# H @7 [, T9 }' K
/ J5 Q$ ?* s- O( g; ~' L
! o# w0 R d' {select b’01110010′
6 h+ [7 B7 n3 I+ F
; v4 x/ N2 r2 F6 n4 I6 ] ! v2 D" O& f. |% K
3 R' X D# _0 h4 S9 ^查询结果0 j8 R3 `1 p: g
7 N% t" q2 E' O2 v
4 w- M3 b" S+ W- b. M2 m, g
9 u. r% s6 [# K8 x+————-+5 P( g! q B! W7 W) x
: \# ~6 c4 D$ M( ^3 M* ~8 V| b’01110010′ |5 R: d& V5 {. ]" u1 `
+ _8 Y8 @" G9 g2 O+————-+& ?/ [8 W2 s; g8 d' A
3 \" f( D# |7 N) t' {4 A
| r |& c7 ^, x3 [) G9 k, ~0 m4 Q; }
5 _5 F5 y# m! b/ Z; R R
+————-+
. G; m9 d& D. B# i
6 E1 ?" v: R2 C7 H8 c6 w! }+ o( `1 row in set (0.00 sec)
+ a4 x/ @1 a: [+ E; c* a6 Z6 _( n! r3 T2 X: [
" l; C* ?0 b O! o5 N3 h G% @
9 X: |7 L; J* C/ o$ k这样我们就获得了user()的第一位.其它位依此类推
- P3 z2 L" R+ ^3 m1 [# y$ F* ~8 O4 R8 t# B# { \% _, @
|