通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位0 R: \( E3 z9 x2 R# P1 Q+ R& }
+ V" p7 R( h! y7 s' n7 ^8 l. Q
2 S0 p1 O, l+ I
$ f: n/ `! Y' w) l下面将以查询mysql数据库当中user()的第一位为例:: s+ `5 T5 F4 `4 N% T* n/ \
. V- H% `; C6 q H5 m2 o& E
) L2 F) k! u9 q6 \' z; ?4 |" {
, Z2 j5 i+ B: ^& X
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1); z. i8 k( G* f8 f2 b7 e" |
) H# [0 [3 R* k A O& u
( ?" v, s' N- E) q" y
# J7 \. ^; B5 @! I1 d首先执行如下sql语句:+ i# \" o: b& c. _4 o. E* r3 Z
6 m+ u# g( |( {" J1 V) d 2 k9 B/ `6 g9 [4 L7 d
0 K# Y$ `( w" t4 a5 M; e% Xmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
5 E3 d& E& [: Q
L% l' P; a- b' P( A+ N 3 J* R4 W4 z) R4 h/ }
% W% ?% k* z+ p- I; N% \: I我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的+ F7 e: Q0 U" f
7 }! ^) u, {7 u `' m4 O: Q
. E, y Z% P# a; N
5 m- @1 W4 h P" T) c第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1+ r1 p' j8 D. S3 l
1 L) v3 H2 f2 w) {- T; ^
" C" M, |" D% j1 \0 E: o4 j* s5 ~0 @( D( c2 X) I4 F/ L# \: s
如果运算结果为1,说明第一位为0,不为1
J6 s$ c9 Q1 ?7 J, J8 w3 ?5 N- `+ S3 H: r8 y. [3 w
2 J& M+ ~" M) _2 S# Z$ D2 @. O6 P& ~% G
+————————————–+
0 x/ y1 ]/ D8 N- `4 F [( C( Y* L0 c4 p& c8 R
| (ascii((substr(user(),1,1))) >> 7)=0 |" e" y% J$ E! T7 A5 U; j3 H6 \( @
3 K: M7 p# _- ?; x+ _1 t# F( V+————————————–+6 T7 D4 i" K" m* S4 V$ k
+ d$ @+ {8 |$ k
| 1 |8 a1 n, t; J2 j. M; D& `3 \+ b
7 u* q$ m8 O: ^! Y- V. A5 B
+————————————–+, m% x7 v( B/ K# P. G
) Z1 l& a, j5 x1 }% u1 row in set (0.00 sec)# J7 ?6 g$ B3 d
3 d& Q+ R. g( `7 s9 W! q这样我们就确定这个8bit的ascii的第一位为0
$ ~, I+ i1 \. Z; p, M2 m
4 K2 q, p; A: s6 b! E, I5 N . E0 ]( N5 h$ [; d( t: D4 S7 P
& x+ Q: q5 K% f+ S) Q) c, }3 x& V第二次我们来做6次右偏移来确定前两位2 b2 C! s2 u* S+ Z% H
8 V2 o: u! n. d) o
7 l1 Z8 S: B5 o0 [" i( c7 Z+ ~7 K% c/ u" u8 W+ ]
前两位可能是01或00,即依然可以与0做比较,3 ]5 j. ] B- z7 [$ Q
/ {! w' {+ m+ N1 W I6 C+ v
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;& a/ ?' x: `5 v& D- H2 n! N `: ]
& E9 a0 T# S1 b' G4 Z) N
+————————————–+
% f6 F$ \. }; m6 r$ Q6 y7 K( Y d
| (ascii((substr(user(),1,1))) >> 6)=0 |2 y+ ]/ F; @# e) ?; w @* z, u( |" H- G
+ i( k# p8 K5 t% g& W j f- M" m8 S
+————————————–+
, @0 X7 M% J" u& z9 T1 B3 n! l! A% }* v7 E
| 0 |
* J) G4 ~* K8 T1 X, `6 b' |: v( g+ `, K4 K9 R8 E& T! M
+————————————–+1 _0 a0 Q% D( B1 q
, a% n' r! x- ^+ v" Q
1 row in set (0.00 sec); r ~& J+ o" S2 ^* ?, i* P
# u& ~* r/ k- I. l0 N \) |; K
' f0 }/ Q) O, m( `: f, A! E6 ?
4 U. _. l! I4 @5 j& ~1 L- b
结果为0,即第二位为1
: F/ p" l& L! {1 Y. s' V5 T# \5 E. T" |6 H B6 r
( @0 p' @( p: u% ~% k
! C* H) [/ q4 L+ ^" c: x K# x开始猜测前三位为010或011/ Z( X- B5 C% ]. W3 v2 p9 z
0 b1 j8 v- u, x- v! |
3 O" `9 t% Q! U/ `
) H! M% _$ R2 w0 y! I7 R( v) k6 y
让我们看看010和011的ascii码是多少1 |3 c$ P& A/ S( X' } m
: _1 Z3 `1 Y. e; R1 k; R4 X# A
& U$ ]/ G: \- y* D8 g5 G1 Q" O
8 U' M" G8 q* u# [
分别查询select b’011′ select b’010′
" _$ M2 ?) a: A6 i) ^+ t6 l- z Z$ @( o9 @, L8 l
' Y/ h6 @. V1 z, _" ~- b
L0 Y8 g" _" N7 ~3 F获得结果 010 = 2 011 = 37 y6 J$ h$ l: U
+ p5 \! s" Q X9 Y6 t; L- S9 y
% m- X# u8 K) l; p& q9 y
5 g" c$ o* ]+ ^; t A5 ~2 B执行如下sql:& H% m4 Z9 o- [9 f
! Q2 d: D- R* M+ A9 e
# {# m, v) w! s& l' r+ _. C5 u X
: I& L' Q' x. |1 N6 l5 s# ?/ |( O* fmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
G; |0 p' l* u8 U* x* P: v3 m+ L0 F- O
+————————————–+
- M1 o! s2 _4 s0 p1 L. ^1 {; a( ^7 p! N3 G% L- F
| (ascii((substr(user(),1,1))) >> 5)=2 |
' p3 _3 v% B, G3 {. H# w* V c' k, G6 u' u
+————————————–+
4 Y1 @) U3 f* `, Y+ u z$ R8 @6 ~& n
| 0 |$ T7 a- }- y) p* J: t# F* y! G
' Y% u3 _7 _! a$ ~) R+————————————–+
- |. W- L2 J; K" f0 s0 ~, r+ k" F$ h, y
即前三位不为010,而是011
- s" a& x* v+ ^( B1 [6 i3 h9 b8 W* m# ~, x3 U- ]& @5 ]
3 {7 \ \7 C0 q/ v8 e
' @) a4 v0 r' A! p7 ?1 A直到获得最后一位1 y( X4 k1 c: H% b- P/ I4 ?
1 H! K. z- F# q3 M
1 w$ E7 r- D3 v( E2 {, i/ K' Q
0 f7 K, N) k5 |7 [* M( A最终结果为:011100101 _+ C8 Z! x+ `$ a
4 p: Q- r" z0 ? w2 ?3 _2 I
6 t) x3 M$ u( \ I
' P( O/ M7 `: [/ m! ^- L$ }
转换一下:" \% }- B9 R" H" j6 p# u
/ T! h: r8 D' E
+ A6 {+ k k0 _) K; q( P2 L; H9 X' I* W% ?
select b’01110010′
! M! F: P; ^9 N" o9 L/ V {7 A: r/ }) U2 a" S0 E
9 S/ E6 n+ `' _* ~9 U4 S
. C4 m. k4 F. {& l+ `( e查询结果% `3 L6 O' h. x, C0 ?
5 q8 p. I, X9 ~2 H& e1 ~
. H& |) H3 q# Q/ F' i5 W0 e. z
' O- }1 M9 @3 K) E8 P" ~: r+————-+4 S" J. C5 R9 }3 u9 g0 ~5 u% u
: w# D: ]5 Q! Z
| b’01110010′ |
4 K; }; f7 s+ k) y N2 d- e, [8 Z4 K$ Z
+————-+2 N, s& u/ `) T" B4 |8 F1 e, K
' Y! ^ V% o- @. Z+ J @| r |
* I0 S0 x9 v4 p
9 |4 f3 X6 w7 P$ s# r3 D: e+————-++ y, y$ j0 u8 }/ c2 N# p
' G. S* D) b- [- r0 @; _* X
1 row in set (0.00 sec)6 O3 N% Q) \7 t" d+ Y$ w
' R. ^) h$ C7 t/ M" f7 i
- x! M0 s; {/ l, C+ @6 }$ z3 P5 r
这样我们就获得了user()的第一位.其它位依此类推
3 R2 T0 [5 {! t! R% f
4 t* m/ P) i t4 r0 X |