通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位. h" ?% B. m% d. e: G. R
# k" F1 ~3 n! `) [8 Z
% U+ u; Y! w5 ^
5 W% e! c3 d+ h8 c; n
下面将以查询mysql数据库当中user()的第一位为例:4 J# \* y" G5 ~
/ q! h! p1 k7 w0 k/ r7 B# \6 ]: ] ' R3 o0 U1 H' x" H
1 i0 n4 w/ n2 }# E9 `! i
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)& d2 I" r+ @& T8 x0 F
. K) Q8 B7 W$ i* h, \2 t9 E
7 j' P7 A# l: n5 c5 p* m9 B2 H8 W! L" `" w; W" u' v ]# _
首先执行如下sql语句:
q$ J* v8 ]. X8 g& n+ r1 ^+ D/ C* y+ M
. k! b) Z7 B- V0 @. i& ~& U" z# x$ Z3 N* G* A/ J0 B
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
' ~! D( Y+ F) d! V- c$ m5 }- U5 y' F; Q, E) Z
+ F( v4 V: x& O: G2 A
4 V/ k; |2 g$ q' I/ m我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的. M; S, q$ t: I5 i4 q& V9 X
$ v' |: R) F, d; [; i- ? * x8 Z X) z0 B" [
- I6 ~4 d; W: d第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
! _7 o; M/ X" L1 D. C6 O- n4 y6 P4 V9 k: R w$ N1 j2 U* o
4 @3 g6 e* d) c! _/ N: t! p. [; N
如果运算结果为1,说明第一位为0,不为1
; J2 k" c4 L1 j0 b9 d2 c$ i& M+ I; y, T. f0 r k" y# G" q! M
6 H0 z, d" [/ d# s' G
P$ R& d8 k- W+————————————–+9 K* q8 g* C, U1 y: W% Y
2 N) y* v5 R7 G& @6 l- \' [+ z* c
| (ascii((substr(user(),1,1))) >> 7)=0 |
, `6 T/ g; D" k4 q1 r" T- Y; l2 W/ m
+————————————–+
9 q2 s$ i6 {. r% z
" S7 a* Y! w7 B| 1 |$ ]4 i4 u' k0 A* }
$ x! W# Y0 V, d- R6 B8 Z. @
+————————————–+
( ^' B2 ~0 C' Y0 _( o' n9 |. U. n5 Z: D% K9 C
1 row in set (0.00 sec)& @$ h7 ]' `/ O: R
- P) e; ]; a. @8 J N: b这样我们就确定这个8bit的ascii的第一位为06 r* b3 \4 j& ^: ~
n6 @; k; m( B) ] 2 @9 t6 S1 u! P; ^+ r3 V
) D5 f5 k7 e' X% g0 Z2 u9 h! ]4 `
第二次我们来做6次右偏移来确定前两位
" u! P$ Q; S6 ?) L( |7 x& l8 z
% t' [4 V2 y; b) h+ w P; c: R i$ \: B6 r3 u+ q2 n' @
f& A/ H% i4 T: i+ y: _前两位可能是01或00,即依然可以与0做比较,0 {. k& f4 X! Z% i) t) W
$ Y6 I" I( T' umysql> select (ascii((substr(user(),1,1))) >> 6)=0;
9 H% Q$ M- s! k
0 Q& O, @" ]5 e" ^7 w+————————————–+& b# U9 z( q& E+ H
7 @7 d. d) l! v! P1 \2 x& u# |$ t
| (ascii((substr(user(),1,1))) >> 6)=0 |
$ k2 ]% M+ ]9 v% D' h' x' l) O2 o5 \3 c5 c) O
+————————————–+/ T5 c6 ^4 v) u2 x/ r" [
" T) z& H# F( Z. w2 t| 0 |! y) c% I4 o. A; n
& H# ~" h8 ^9 V- \4 v+————————————–+7 _. J0 m- Q( Y3 c) B
7 d4 k5 U ^$ I& N$ e
1 row in set (0.00 sec)/ r( f+ s0 K- K3 V- a, f
0 s4 j$ {1 C7 f7 b& o, S% o
+ Y0 }6 U, Q% `$ e/ J7 B! Y) h2 N; C& ~; S( L
结果为0,即第二位为1
( F9 m' M5 ^! E7 u6 Y$ d. H# Y) g q% A
' Y3 i2 c+ e! l! \% b; q m! T$ Q' V1 F
开始猜测前三位为010或011
& y+ _( t+ S9 q) K7 O. \3 [, L7 p2 t9 u! H+ N
5 y7 L( h& x* u9 ^+ B
9 h0 J- h3 `& x. h( m% F( L8 v' E让我们看看010和011的ascii码是多少
# T; X1 M. ?" v" Y3 W9 |; P5 `' T) G k+ N1 G: @
" L' J* @8 [) S) f! a
0 G/ @! H5 S/ m: Y/ K* }
分别查询select b’011′ select b’010′
! \ l2 G; m* v$ U
3 U. x6 |1 X. m8 G 2 m% Y* G( o: [
5 N9 s" U8 o' }) I' a
获得结果 010 = 2 011 = 3 W9 A7 V; J2 y3 O% c5 m
- F0 R( l! N: x) c7 T " L, F! k! G+ H
3 c, T. i# i7 K, J执行如下sql:
6 R1 p( ]& ]0 V( P8 }2 z; a
6 }! T; Y, x# q( Y( i
% P' ?& z# N2 q) ?" _; `. s6 I! C7 F5 L. k9 U
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
5 z$ e R* {/ z; s% c( y. e3 F
0 T8 m2 x* X T! a8 O+————————————–+0 t2 `0 ^7 e* [: x4 h2 b
, o1 u* \4 j* [* Q| (ascii((substr(user(),1,1))) >> 5)=2 |, t* X; r- K! b j1 D0 w
4 M) s, Y/ K1 G" _ U J# o4 e+————————————–+
- X9 [% X4 V+ p7 V. _: U, Q/ Z3 `. K/ D: c
| 0 |
1 @6 s% l# `; N! K7 `9 n& @& H7 ]9 M8 S" f1 [0 R9 q
+————————————–+- q* S7 W2 F/ ]- o& C
/ i* y+ O/ ^0 T# r
即前三位不为010,而是011" o" C5 W1 _4 J
- I' v+ X& U8 u* Q% k
$ z1 G* | Q9 G# P
+ n, [3 r% W3 Z+ ?" `5 q直到获得最后一位
4 d* S( y( Y0 n& j, J: L4 w; P
+ E ~( \* U- ?
, i! N# J% d* U# w. Z
8 w6 X1 u( Z& j6 F* Y. n" K最终结果为:01110010' [* O: G( t) W& a$ y( X: w/ v
% s& _- O) |. J/ i6 [
# x/ V! s2 f! a$ V9 G+ A& R
& L; {1 I' P3 ]9 U转换一下:& B2 L( J# k' p6 ^3 I, a
+ n N8 [/ t0 k' F4 w
% `% m- C% X" B g' q6 a" N- t! G
select b’01110010′5 h$ D7 e1 a: Q# s. A9 A
( z5 X+ D" e8 q' Q5 K0 O: c: ]
1 f; p/ N; M/ c2 W) e$ s6 G1 m8 l+ A
x2 g7 h8 V" g* }查询结果
7 K. l3 Q Y+ C: ^3 X
( d* C' t) j2 T2 T0 @% B" m0 E3 t
) G" E9 l/ \- Q: e* |) n+ [; I9 H( u* w0 L
+————-+
( o$ ~' a5 s3 v1 r8 q z5 `% Q
C8 `/ b8 j1 g& V! }" N| b’01110010′ |
4 l! j& M5 h1 ~: P
2 ~0 [5 l3 H+ }, w+————-+
) i7 R8 e5 k# E% T* f
; |8 m( x6 I. |6 P/ T1 @| r |* p" `$ C0 f+ S5 E/ H7 r8 F& h
' ~8 k/ G6 I0 _& h# P
+————-+
" h7 i. [6 p$ C! F, `8 G
4 P4 u! M. m7 w- z2 T2 @. Q1 row in set (0.00 sec)
$ q& p6 z, h0 N4 g9 u J+ i1 h; k8 [; i+ |9 Z9 I
- K1 P+ H7 }$ |! l K* [. f6 V- ]8 r" V C. L) d, ?
这样我们就获得了user()的第一位.其它位依此类推+ ?+ _$ A# X1 I, ^
1 r) W5 d. I9 s |