通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位$ k& H( h6 u! w2 [; I5 u
( G& c) z0 M& a' w7 w& Q
9 H9 S% ?) s1 n5 L; X0 L
) V! i3 f3 z& R; l( Q. j" {
下面将以查询mysql数据库当中user()的第一位为例:
5 _3 {" O3 W; O, L8 l: j+ O4 m$ @1 j4 h! R4 z% z4 U
# Z3 m+ ~' m- K8 e3 F7 x! _
) u- a/ }4 Z% F9 j% S! `ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)0 E9 W. o: |. _/ O/ ]3 }8 Z2 F
. h" T* y. w# k / u4 r( S {7 V& a% V( e- r2 ^
3 {! Y6 m0 ]7 ]; V; {. j首先执行如下sql语句:
4 w9 W( {8 |6 C+ ~ g6 `" s9 x* a% z/ C! }. {7 \1 v9 K
$ P3 ~" s/ U1 v
" r& Q, }# {; k
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
6 D; o7 v% r I* {; {/ c5 S7 {$ t3 L
5 n) Y' Q3 j! p
7 @, a% m; k9 }8 Q+ C- C" K我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
3 G7 I! M+ c, _, c( y' k& _6 H( ^. x- {" ~5 k
4 C, r7 S" b8 E
5 D0 z, X5 |* z5 d第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
. x2 v q) N, ]) \+ ]0 I5 t% g3 C) `
& j8 N5 d. U1 C# a: \+ x) n/ m3 A
如果运算结果为1,说明第一位为0,不为1
- {+ t* v7 G5 D* k* `$ R/ Z# m
4 T4 l- M8 z/ e$ [* } 5 I1 t5 j, t" F- B# [# d- c
% c h* `" R! ]& _1 k% P& @
+————————————–+) T# W1 b w: q4 k- g2 D0 `
) V6 G' m4 v6 Z" S; k) I9 @' N
| (ascii((substr(user(),1,1))) >> 7)=0 |1 Q$ o( x; O7 Y7 u% X
! E1 L5 C4 r. {3 R8 O
+————————————–+
2 A/ U' v9 C( \% F% @$ [6 ]) e1 i. H6 Y
| 1 |
( f. L4 r% O; x2 q
! {# j6 Q8 j. ~1 X6 C) ]. U- W+————————————–+
& T) J6 T" z6 Q$ d- ~
* t/ ~+ s1 X: v ?2 z1 row in set (0.00 sec)
; D! O' b0 E" ? [) Y" [+ @3 I; X! r1 r
这样我们就确定这个8bit的ascii的第一位为0
& U: K- q* n" H7 ^
; w$ E0 |. t" b7 Y
% k3 r9 M! }' r6 D
. T# E, J! g+ D第二次我们来做6次右偏移来确定前两位
( \- I% B' D4 F$ v
. v! O: ]" A: v5 I" v* a 7 W; w1 { j6 N
4 z; O: @( a% F* H& P前两位可能是01或00,即依然可以与0做比较,
1 I; G( ?6 k( o; G$ M
# _7 [* j' _3 a7 y( N7 B2 Z5 Mmysql> select (ascii((substr(user(),1,1))) >> 6)=0;( c5 X* T3 S' ~/ S3 Z. f# t
( {" ^; M0 H# W$ T0 Q2 F2 X3 b+————————————–+
1 y4 }! l5 E3 N* X, V0 `, {8 Y, I0 G9 v& ~/ g& s5 }
| (ascii((substr(user(),1,1))) >> 6)=0 |6 T, s, K, \, Z* |- C
+ V( ~ @$ h2 I+ \# S2 D; P2 y: ~
+————————————–+
, h/ J! x: r) p! S* Z! I2 D* n3 q8 S3 b- v! v; X' P
| 0 |( j! Q4 s( O1 O4 i6 p
) |3 @& x h. O: f/ c- l+————————————–+; ^- c- ~5 i. [. t) k7 X
) `& C, B- p+ x3 c9 T
1 row in set (0.00 sec)- z6 F$ B6 L7 Q2 L
) Y8 P; O* D' L+ X! [! P! b
; |7 s3 }! {7 Y* F; \
* l* K6 \9 O1 }, L+ p ~8 k结果为0,即第二位为1" j' Y7 ~% c Y" A
* x# V5 ~0 }0 b/ i9 c- ?+ T
3 M, a% r9 H! \1 ^: i) O+ h
8 h* r2 q6 W' O# U# r- f开始猜测前三位为010或011) n, O9 x0 g2 G C% n9 k% S0 j
}( x: H! ^. W$ I 9 l: ?, d1 [& s
5 }# @' e& x7 B' N. |) H: D让我们看看010和011的ascii码是多少
, V7 F" ?+ V0 K- {" o3 k
) m3 @& N0 r& \5 p# Z8 I9 X/ C! f
E- v' }" j( M) k7 M Y
3 O! b5 A/ A% N( N: K1 V& d分别查询select b’011′ select b’010′$ ^3 l9 D k& O1 z
; q6 K) A1 R7 f
* q# _: Q$ K: z! Y4 h! w' ^
- M- ~# A2 N% j* O+ E获得结果 010 = 2 011 = 39 D5 @$ _" J9 I/ t, d
3 R2 y0 z2 @+ T 4 m- x; g# n4 K, q1 E9 v* B0 }
( O& }% f2 N N执行如下sql:- v9 b8 P+ q# ?# b* p% N& u9 O
+ ^; Z5 x; z5 t# f
- V6 Q% s$ O8 z$ a; r' o( q1 E0 _- h! _5 W+ l. m% _+ ]
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;# Y4 S& C4 {! n5 z6 o
, b/ q2 V4 x+ c" r5 w! a
+————————————–+ h+ h! Y% h9 X' p4 C
! ?3 f& B6 L. B/ `4 }| (ascii((substr(user(),1,1))) >> 5)=2 |4 Q2 z# t( Z0 V: {/ O9 b
. s% `4 A: n* T* R) Q! I+————————————–+
9 m( e# N% P7 ]6 y% R0 A( k9 Q4 P# O& t0 Q- ?
| 0 |
, c+ `. m) |$ o
/ \/ r/ g- }9 W, k& L3 ]' X+————————————–+* H% L; K. S# S* G8 s
: q6 E/ ~% j2 P7 F4 `, P" ]即前三位不为010,而是011# S" k+ P" j& G& q" i: p
- g4 y6 X! \; J! G
1 H. L! p _( e. d6 p- I3 \1 ^
|9 W) M. k; ?: u( D5 J5 N8 r) k
直到获得最后一位
6 P4 n* d! m% } n6 X; H. H6 M! ^; Q' F2 P9 u; \# L8 G. z
4 s7 @! r: y$ ]% L
2 L3 m" M6 G5 B2 n( m最终结果为:01110010/ t7 X8 k% v0 |# I5 _7 l
, M/ A0 S: B t! ^3 z
[6 m7 }. b8 U& y$ @! c) ]% {/ ?' Y$ C; {6 n
转换一下:
2 k/ H, d U4 z# X4 \/ Q) W3 y; X$ f6 H$ h- v% Y9 v
* w" E3 O% ~, }! N5 M5 o. H9 O. ~8 `+ ]7 V, d
select b’01110010′- W Y% x! A) U. R
( D( N3 X7 a9 _+ U" W ( a3 @+ y" I6 B9 G- }
) {: p1 d W5 S1 i3 N查询结果3 q9 o3 a, `! Q- m- ]
* I2 L) _2 b j8 C& _. J& D
! C5 o* R$ ^9 T4 s0 N
: r/ f" }7 e3 [5 s/ b2 T% t+————-+$ c8 p# z$ n: y( x: U
7 B* D0 q# n1 _7 h& v8 N! Y+ V
| b’01110010′ |" {: N( M" N; l+ P# K0 y" X. M9 \
K2 P2 O5 R3 F2 H1 \
+————-+
9 h, n+ x3 @. W' a4 ^" J3 B8 v% K7 e7 C
| r |* E5 J( D9 V3 F& T" W
1 K; B' Y2 p1 ^) h6 `6 Q
+————-+
0 Q5 E# r1 `. S* k
j# w C6 w( o" p. v8 y1 row in set (0.00 sec)( ~2 Y' D% f3 [! ?$ T* m
! t( ?. h v0 z; a$ s8 Q
* }5 q6 A2 R+ U* S
2 J6 t# P5 b5 d2 x6 ~3 t这样我们就获得了user()的第一位.其它位依此类推0 ~, e8 s! b( ?' K# d2 f
: B% G% ~( H0 r$ M F; v
|