通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位5 A" q+ a0 ~- z6 `2 b5 I) O6 U
' Y0 F2 v0 s* L/ ^- }) s
: ?/ I1 Y$ C9 ~3 A ^
- O/ M) Z4 U7 N1 I9 L! b下面将以查询mysql数据库当中user()的第一位为例:
+ X. ?" A3 I1 f3 q; j" x! _+ ?; U9 Z; s6 @3 v P. {8 n$ I
: S4 j3 C+ `6 n
3 |" b, F6 p3 q2 L; c7 ^ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)8 p' x: l; ? ~- y
* a* f) @$ H0 }
, n% W* ~: C1 ^" C5 W' L( q3 i7 }3 Q2 H
首先执行如下sql语句:* i0 e/ ^9 h5 ~/ ~! {
( {) x. B3 |0 S! j/ \) C( t
0 A) C$ K. J4 f P8 W/ q
0 D* e9 t: n% c2 _. k
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
! y) B1 e8 W' C* _+ z6 d% M# R9 V4 E% \. D, X3 E
" I" H4 R# E% ]; u! y
. \7 g0 K/ R3 X7 [我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的& B$ l! Q0 W* ^: ~
4 [' d5 ?3 V5 ^( D; q6 h" h
# a8 I& t# S$ L- k4 x
# |: W9 }; F! R$ U% A( V第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为17 b1 @- ~9 q) E/ Z% C
6 c4 j' `- ~* H
3 _. X( O% k `8 O/ u8 ?- j& k5 @0 p
8 R( O; ?! b6 t4 `; }如果运算结果为1,说明第一位为0,不为1
1 j2 V. R; m" y1 v5 H
: ~1 u* l4 C; y & P6 U5 T0 M% _$ `2 _4 N% U
, z" w" {" c( m# G/ F/ z+————————————–+
0 \( ^' W6 X( N# U, G z- ~/ f
5 |* ?6 q- c; ^6 F" O| (ascii((substr(user(),1,1))) >> 7)=0 |
' A. n5 [7 I8 `; w! ]4 u4 ~
2 [" [4 {* c# G- N" |+ C) \0 X, d5 H, l* N+————————————–+
: m2 c. u p; I! m
8 K% x& ^1 R$ e g( _| 1 |
; j# F, l8 u, a0 w0 F( J7 ?! B' T: k6 q1 d( R( N
+————————————–+
3 v& e4 Z5 e8 d8 v- O8 |7 p
7 S. _& E& v$ Q5 O9 o% i( N1 row in set (0.00 sec)
7 H! [" ~( @% n$ [5 x' x( [- l9 k2 v3 f6 q& X: A' s. B7 q% G' w
这样我们就确定这个8bit的ascii的第一位为0& N1 `; @! [. U$ B; S. k+ }& T
$ @$ n d8 @8 `3 r4 T5 _
; Z6 ]% H+ k! u6 l7 [5 z$ U! R
3 y; v! G5 ^/ [0 u0 w
第二次我们来做6次右偏移来确定前两位
5 L* Y$ Y8 z0 M1 V4 I. m9 n7 U% K( t
: r7 w5 |* ?6 i
2 d, d5 r! n. P0 f! o前两位可能是01或00,即依然可以与0做比较,
& m1 L8 A3 x2 j- u, N8 L! U/ a6 c, Z6 @8 G: r8 Y
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
3 n2 ^+ d( t+ p; m' z$ [6 [
7 c% T/ ?+ Y l4 J+————————————–+
" A8 s2 Z4 u' R' W$ _! I8 Y0 Y( C) {- L5 m j8 r# p
| (ascii((substr(user(),1,1))) >> 6)=0 |4 P5 E$ l' K. ]" K* K
/ m' @' [& r" |' ]3 g5 v$ t/ x
+————————————–+
6 @' I* L0 q. {. v3 t( S: A& r; c
| 0 |% V( S/ A& }" G2 H
: N- B, j- j) h* T+ X) [+————————————–+# v! L2 x0 w) p; F
- q* Y; K! D5 p4 a
1 row in set (0.00 sec)
' _5 _6 G; x3 |+ _% K$ x3 u. O1 E+ j1 u" [
: ~$ y; W& O+ Y2 g+ W7 T* D& I7 p6 V
( B4 _& g. l( i! C# m: L结果为0,即第二位为1
$ `# v4 z" k3 Z( g# {' Z& F' d) }- P+ q+ X* d1 S0 J! e) @4 b3 y
5 B7 P$ {$ t6 _7 P- o2 t2 [
9 I( H6 ]* X v U* L开始猜测前三位为010或011
+ W3 a+ W3 I3 I O
. e8 N1 V0 f7 L$ K4 I& a3 g6 ~ 2 b! }. d3 B# s$ Y3 X
2 m% x% U" ~5 g- L让我们看看010和011的ascii码是多少9 ~" a4 S' N: x/ Z
2 O- b7 f0 b2 X) @* d1 y4 ^2 F
* S, _, U) Q" z* J% Y# F: {/ ^/ C: [3 l! m- t4 X7 i
分别查询select b’011′ select b’010′
; I1 U1 W; Y0 b: U0 ~( o
% u3 v1 W/ ^! d + F G( t8 g, k7 {* U
& m: D! }& [+ N% Y6 q8 d, e获得结果 010 = 2 011 = 3& g4 K: M4 O- P" l1 z `
/ V: U# o# u: \3 ^) u7 b8 H8 }
c- O8 I8 B1 ^/ {( B. j& W, X, x0 g8 d# |
执行如下sql:
# G6 n# f8 q& H2 Q6 k# u0 a' l: N& x5 N
& y: [+ G& V9 }: y; k$ _, _% e8 W3 J6 {* Q. t* s
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;' F# y. g9 x' o0 `" [+ P
: l4 e7 d1 J, z" c- ^
+————————————–+1 |5 z4 a* `2 g
; C# Y7 m$ Q3 y: ?5 C3 x! E! _
| (ascii((substr(user(),1,1))) >> 5)=2 |1 L6 W5 n2 ~" O2 K) ~
4 o" M+ Q) x" ^7 N, W+————————————–+5 [: D& M3 A+ g% g5 R
2 o$ q( ?8 T8 L0 A5 j
| 0 |+ X/ T. t* Z" v# g g
: ]5 J4 i7 ]" S' C7 P8 r1 ?
+————————————–+- [: z4 |; g5 ^9 N9 H1 r. E5 T
! b# ^7 Q; f6 J3 D$ t即前三位不为010,而是0111 C L. {, i( d/ f; u$ R( O, ]
G! ?- V: e% H: G( v$ g
2 u: S+ Y" _: Q8 x# Y6 K {" M0 W
4 ?& l* I, k: w4 a# K* c( {直到获得最后一位
+ z2 W# M5 g& }- G4 y5 @) Y8 W+ Z9 f4 N, E! V& C
) e; T8 r: a2 E$ b {/ D
. @% z: D7 K U$ I最终结果为:01110010' V3 K# ?7 z, n/ i# a5 t$ _
. F& q5 u9 V- ~4 S8 b9 |
" y' |+ L- ?( o6 d7 p7 k! J3 O S8 z
转换一下:
: b4 X( E6 G, D$ \1 l0 ?7 @- e; b! o4 L0 N
6 D5 g8 ?8 X0 c2 d
+ b j' e) A6 C1 d+ e
select b’01110010′
. I4 w) ~+ ]. E2 y3 h5 W* P+ s
0 u) t0 t" h" p3 H/ b/ H; |" t" `
1 a8 a5 x( Y- g6 T; g2 a* g0 W6 r# Q查询结果2 T* W: o8 }' K& `& h: _
5 v1 [5 ^. Z3 y( f# T7 o7 M
' {* G) R1 ~( I( y
% f. I3 W2 \' z4 ?) K) B$ q
+————-+; v! w/ n0 A3 {
3 z9 V$ O9 T$ l% z n* Q: O| b’01110010′ |
4 s4 A2 k. r* ~# @: n3 w9 S1 G, U. d! g8 }: ^
+————-+ P; ~& u$ z! x( U# `& b
( h! Z( J/ A- J| r |. L( U3 `/ {& \% D6 v) E6 S
I% S m% K, y$ p0 U+ @, y( t
+————-+8 g4 a5 b2 Y- N; C' `6 q, I
8 N* M f, o% t0 O' i2 C6 g+ h
1 row in set (0.00 sec)% V4 t* Y8 j* ^
7 F, b, o2 Z8 _" w3 q0 i
6 T' b S5 |+ P6 b
$ ]0 A: X+ J+ I( Z3 k& C这样我们就获得了user()的第一位.其它位依此类推: A+ `3 b$ k) }$ \& h
3 g* Y% t# A- h |