通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
% [9 b F& r% y3 K9 D6 m4 F3 @4 a! n' \5 r& ^0 K9 T6 e
" s8 X8 |% H* @. d0 }9 ~# I- V- ?9 ?% _( g/ j& u7 r
下面将以查询mysql数据库当中user()的第一位为例:5 v- |/ g* f5 [1 J A% V1 ^3 H# I7 q6 l
$ i4 ~- @' N! E! c( f' [
. x3 z9 H/ ~4 D3 w) Z0 c( p9 X% L p _1 N6 ~- c/ {
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
) H* X$ s% R& c; A1 ^+ m, f0 d
# e: q& c& P! h/ k3 b& X1 Q1 E D
# V! J7 E2 e( `% Y& E4 z) m! h9 Z; h& N/ h
首先执行如下sql语句:9 J- ]' O% l' M* G' b
/ f" Q0 x; ]' P" n
5 {& [' o7 h0 N& D( N7 O6 j+ ^) [" x p" `0 H* K
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
7 }7 j7 J8 Z0 O& ?( }1 i; V! E0 ^, W% W4 ]3 c% K' O
( W; Z# g% |8 H4 N7 L
9 _; ^4 f7 \8 c( e' q- @( W! g
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的. t* {5 \9 h0 W T) K, `
0 ^9 i% h: {- B* N: P $ g: a6 S# y) P) B! D1 A
/ P1 x# g8 Q: Z& @
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
$ c4 t, p1 ?: D' k) p) S
: c4 m+ l- E" ]. B* ~
G5 v8 Q& C3 V* J# a0 Z/ t! v; h* p3 p" j% }
如果运算结果为1,说明第一位为0,不为1
; n H- [- g; k/ ]; _
% P8 M- ~+ v: ^ D% p- o1 m- r9 T/ w, b % v6 o! L. j* M. K/ E7 t, P5 y
- p7 v- S2 K' X4 i) j! E% B+————————————–+9 `$ {) Q4 B# R. t
0 [" k$ l7 U6 `/ g: [4 M/ Y9 A
| (ascii((substr(user(),1,1))) >> 7)=0 |
3 ]; u4 ]% z! C% D8 ^" h4 k/ @) a! d! Z3 x
+————————————–+* G, h1 L7 K p/ t+ y+ j" | S
c5 f% e1 g: X% y/ L
| 1 |# j. O; k( o4 }
5 U4 e, `8 D" B, T" {8 h+————————————–+2 g. i. n( f M
4 o5 g6 @; [' q' s+ V1 row in set (0.00 sec)
/ M% x) h" S% h1 S, b& f. i
1 O1 f5 I7 L; N9 J" x% \这样我们就确定这个8bit的ascii的第一位为0; a/ Q) V8 l; b: }
: i6 z& @. u0 V* r3 Z
- P% D+ {/ c0 r+ }6 d' d
7 x5 I, e7 i7 I1 ]第二次我们来做6次右偏移来确定前两位
4 N& O$ G$ d+ z! ?; T: J4 t& Z. q( B% H0 M- z; v/ t: t L* d0 e5 v
( n+ s6 e" ^; V2 g4 T9 e/ I
8 j8 p8 G6 `8 o前两位可能是01或00,即依然可以与0做比较,# I: L. ?* f7 U2 q: _5 q2 c
$ A) M% E9 P3 `/ K& U1 A) qmysql> select (ascii((substr(user(),1,1))) >> 6)=0;3 Z% ~4 q8 e$ J
/ n1 V3 \. b, b& P+ _" z" `% H+————————————–+ m4 |2 k! i5 n# X
+ }$ t+ [6 L6 j. l5 B8 F
| (ascii((substr(user(),1,1))) >> 6)=0 |# f& h0 B' ~5 q* u
8 N7 h9 o% d* z8 I; N% V- Z7 h
+————————————–+/ X. d, k5 I) N. T- n
$ J+ ]# Z7 b+ g: x& a6 _| 0 |% y+ ]3 b, A' _0 e2 P" p5 v9 `
3 f2 ?" G3 h7 t2 x: J' V% v, ^+ E+————————————–+
3 M1 m! b1 h% z; z1 A: L( N$ F8 w! g& [
1 row in set (0.00 sec)! @8 G9 c6 o9 L4 k: z* T3 {
2 V8 l9 L4 j: E- Q& M
' J& G6 R$ O* G* \
/ p4 o- @2 T' \. ` B- O3 i! l结果为0,即第二位为1. Q$ a9 Q# u- U, Q( N, ?
: u& [2 h' ~7 r3 r
2 M8 P$ b0 i! E8 j! c, f3 n3 e" P
; S( L+ c- q8 L9 T' a* s l* { i开始猜测前三位为010或011
3 k1 w9 u. ^5 @9 v4 F
9 T" m- f& F& l5 ~0 y! _ ]7 L- X7 K. Y, z3 {
- K; o, g7 G% p- V; e# i2 n
让我们看看010和011的ascii码是多少
$ x0 X& m2 y; ~+ I9 Y3 }, C1 H& v O
, c7 n+ a3 C0 @ d5 o$ W" i( v1 U) ~
3 j7 e+ q- q5 v5 [ l) c$ v' J7 |* \分别查询select b’011′ select b’010′
1 j" l! E* A K! o8 ?+ w0 W+ k% [- T `* @( y
" S/ h* t- M0 C6 ]- s0 Y) ^0 A8 k
: s" |) t% i8 w- t( O获得结果 010 = 2 011 = 3# {; E# x9 ?7 v! T! k+ m$ z' S
0 D2 `% l$ Q6 `% s5 z: M* |
% m l% `; c/ S) _; y
5 v: z7 I( _5 d) O( ^+ _+ t
执行如下sql:( z& `1 g4 G$ C, Y
3 _ A* k: G( j 9 t6 }, Z, t8 O5 R: r7 g6 t7 j
9 l( S% {4 M1 S! \0 s* U
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
' v3 ^% ?0 S4 A: w
$ a, X h. H, K+ C4 p- O/ a+————————————–+
3 _% { p5 B: y; p8 V
' I, ?0 I/ s( p| (ascii((substr(user(),1,1))) >> 5)=2 |
* W. C0 x$ C$ M$ b3 n0 r. g5 e2 _- s* ^; o9 f1 q; b8 N
+————————————–+4 B9 N* B6 |- w9 N
) Z% M, g2 b) p
| 0 |# N L5 ? c' b; L/ j
, v& h6 t; T( n+ |3 n1 N& V/ v+————————————–+
, u. y8 U6 Y0 x) j6 _! ^% s e
0 K6 ]/ ^6 m( M+ ~) j即前三位不为010,而是011
, {1 M6 F4 }$ F3 x6 \5 N; l7 G" `+ g
7 K) f1 Q+ n3 m X- o' @2 M+ j
5 N: ^) _; c) ]5 l1 O" }9 Q直到获得最后一位
1 ~1 r8 w1 j4 `( ^% c% I) M( a
" @! L9 H- X! m* M$ S* M7 b
, L1 k0 x2 P E3 d) ]1 c: F0 n: ?2 @/ F* l% v' P
最终结果为:01110010
0 I' N: D: e1 p; F) l4 {
0 t, P4 u, @3 _! f9 E' Z+ o. P 0 t0 I; W% a( }8 J8 G# A% l/ C
7 ]. E- Y& a' k# u9 A转换一下:
* Y# n$ h! A2 j# m# O
5 N1 ?; E& s& |- c& r( I, I + O& |. J' P4 [8 `+ J
7 v; t* Q2 ]4 X
select b’01110010′8 ^# U1 M, _/ V0 |, a# c
9 Q3 H8 q5 A9 c
. @* w0 C2 q @% H
0 l3 B2 Q7 x* u& I+ v; q7 @查询结果/ p" k& J+ K& t- y+ L: b6 B! \$ s
; |, V: E" w! G- U0 ^
6 L) j U' a$ Y$ E' C: i
) J4 Y0 ^# m* b' y" y
+————-+! T. k3 g+ {( u: \) C
! u [* d: J/ |' U: s+ o' f| b’01110010′ |( [1 b3 L7 r# X: ~' F
9 c0 P' G* a, ~2 o+————-+
9 M( A: h3 U2 n. i: p6 J
2 e# m! _+ [* h# u| r |! q5 ~. _+ W. t2 F( ^% D5 S) G/ S
0 A- S: Q- l- `# K! p3 s, c+————-+3 H1 _2 j Z K# E" N4 u
8 Q8 ?0 s! `* B& Q. I. M
1 row in set (0.00 sec)/ V$ T- [' \. v0 [5 U7 v
# {2 B8 s" c1 D, T% J m; w
; x" |' g$ _1 e! F: D( M5 _
$ k$ U# L; v% Q- W5 H& x这样我们就获得了user()的第一位.其它位依此类推. l3 ~3 Q6 x* y- y. W
& |' N0 S# P* j, e6 j
|