通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位( l/ _+ X2 Y, O
# a9 C; r! U% Q
5 j8 B2 |: M& @9 P
$ J& y m, ~3 X( g! N% }下面将以查询mysql数据库当中user()的第一位为例:
: l6 Q. q( x. e6 ?+ K- y/ y' Q
1 I& U! i2 k+ R; ?9 Z 7 ?! `& b! {4 w3 g& {' C
; [' B- |8 k' { K
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
$ d" c! y5 \4 Q5 }" ^" e+ j" Y
0 l. {8 Y4 M/ g% b3 U . m3 f; ?, f# L9 g; X$ f
4 U) y4 p( a( w x2 [
首先执行如下sql语句:8 Y1 P! H2 H) T8 E& k7 H/ m h& i
) e! E3 X8 K) X3 P5 ^/ ~5 P
7 q2 K; I, f3 {2 \- \- M
+ O: J+ j( C' l8 x! j+ |* fmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
! A @6 O+ t$ U$ Z( ^
2 C2 X* p$ N% C Q( k; ?7 x7 _ 7 {) u, V# _. U6 ?7 i$ |3 k
K { C4 ?& L9 [
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的6 q3 |; q. ~- z$ s$ y6 m, w
+ U) ]# S/ ]' ~) N/ ^* m1 n
. T9 J, h' w# ^4 x' \ t. w2 j
4 a* E! b; u% k3 { ` v第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
8 v, m" V' Y1 o3 ^
- {( V, H# s' i* w+ \ 1 T' b n. S! u0 t# B
~8 N2 F3 e: y. B如果运算结果为1,说明第一位为0,不为1
3 h) t4 j; H0 r- w8 A; x2 i1 u
9 ^1 Y, [" u' s& C* r3 \+ } 9 B+ h" P6 H+ c* k4 N- W/ j: }& U
, m1 M: m# o9 E2 D7 }3 G o0 g
+————————————–+6 ]' X) o {# r
- n& }( V9 D, x& p4 u) T2 j| (ascii((substr(user(),1,1))) >> 7)=0 |
& j' r% S+ q9 O! V" S0 P$ ^6 C- J/ A0 ?2 _3 E2 r& D5 x
+————————————–+, Y+ R j' X) z3 t" J
" v3 _ c$ g6 i0 Z| 1 |
! ^" {: A! g% D2 u! z8 |% J p
4 l" h. w1 x4 t& z3 b" v+————————————–+) U, z. Z7 |" s6 H( \* x6 ~$ u3 U
* H4 S6 d& ?7 s6 [+ O" W1 row in set (0.00 sec)4 o5 d6 ?. r# B7 c; P( |
% {$ G% G1 V, C, A
这样我们就确定这个8bit的ascii的第一位为09 V9 ]3 R/ R0 q+ I
% b, v7 V# c7 r, j
- t+ q" T. J& m& h7 c, j3 [1 g
; Y1 f; z9 b7 ]$ `# q" A: C第二次我们来做6次右偏移来确定前两位& ^! L% U7 e+ ]
$ z0 v/ Y! a) a, h7 }0 C$ s
) u, E+ X& ?, i: h; E/ b# f
2 x# C! J( q. A0 t# k: s前两位可能是01或00,即依然可以与0做比较,
* I7 U' c. b6 ]1 D: O/ E0 S8 _. L; u0 s4 x" r' @8 O4 V/ m
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;8 L8 Z8 I! H* `% R3 l# D: s
9 A6 b* p* e3 f: k ]* \3 F0 m/ w
+————————————–+
, x3 {4 a& v" V7 @) b3 c" U9 X, O0 e9 w F
| (ascii((substr(user(),1,1))) >> 6)=0 |2 c8 u E& Q+ A( ~* e1 f8 w
( O* ?" |1 G& Z; I( K( |( G$ a
+————————————–+
: ~% r$ e/ Y0 `; Z( p
5 [6 A3 a7 m6 @| 0 |+ U& y' m. j. N/ Z4 S, U
$ G( P, _% ?9 q, [2 P t) y( L
+————————————–+
: b# l7 ~/ m1 V( F2 W/ r; D5 Q {: z! b( Y
1 row in set (0.00 sec)$ V; ~" H; m9 o6 e. o, @
; Z% V1 q# V2 s
4 ]3 N* z# \: h- x# l) N! @
4 Z; G; i- m- v6 `5 q! [9 [结果为0,即第二位为1
u% y" w# R9 M* F2 \# r3 |6 ?) A% o- l/ U E) H
( z5 @. H- s9 W- \, C! P. T1 x
( }( T& W# o O. [/ @' q
开始猜测前三位为010或011 r8 ~9 @- u3 J2 b# t, Y$ M
2 E2 c2 o) r+ \, O
& V& C1 h P& F4 b& L
! | k( g! p- Y2 _( U让我们看看010和011的ascii码是多少; l! E5 F( a& |$ j3 G Z7 V* e
7 D! z0 ^2 B8 V, p/ N0 F0 C
. _5 F y) ]& i4 ~4 Z' m& @ Q! K" W. s. W( R. j+ u4 U: h
分别查询select b’011′ select b’010′' Z# l, W0 b! V1 j) Z5 v
$ d W2 E! B! ?9 `) J0 G. x
% s: K" C0 R# T8 T; m6 }' Q) b5 P y: Q; i6 ?% y
获得结果 010 = 2 011 = 35 e" k$ ~+ z! i9 _6 |$ V. b
* {$ S" t1 u8 h) V/ `1 ^
6 Q: G4 y7 k1 t# `2 Y( k+ d# \2 m& f7 R" d" u% V
执行如下sql:
: O( F* y& y" W* u: O
0 u/ y" A5 N' Z 4 c; I& Q) G8 ]0 t- h
% u/ `) p7 _* ^ J" w& |. [
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
/ h9 K8 j. a( Z6 n0 W' [
$ K z3 ?) M: C, h+————————————–++ J, d( e: B8 L# O d
$ E l% P1 u" |& _. H6 N
| (ascii((substr(user(),1,1))) >> 5)=2 |
3 N1 K0 V" g* {6 i+ L; F- v% b F! [; H* y: @
+————————————–+
1 {5 q8 g; @4 M& @
# w4 l3 `/ A L. V S| 0 |
& E2 H) l# S! f9 |7 S* g( \
4 L% f5 o. ^, f( Q) k/ V+————————————–+
' s8 n+ S- o" P d6 r6 x) M/ \5 Y$ T
即前三位不为010,而是011
- C2 l% }% m) O0 S' q' }& f) g, l5 w: z/ V
7 g6 {8 O8 u% |
: y+ `# c3 d& J- _直到获得最后一位$ s- Q- o) R9 o& i* z1 {, ]
+ Y# V9 h, x: A' {/ v! \
& a. {1 e+ V& S
( x9 m! v3 t. |0 v8 t6 U2 {4 x, b最终结果为:01110010' k) ^( g5 H) H5 n& P
6 F* S1 g) o& Q, w6 N" P, H 6 j; d6 X- s- M. ]' k$ u% s, l
) P3 z; [+ O" L2 k T; L' h" r
转换一下:9 T( f8 C8 V$ O7 f! C" h
8 Q5 I2 h1 A5 J! ]
. a5 `+ Y. m& d) b3 I
. C l) w' L8 n+ h9 z5 L0 J6 Qselect b’01110010′
( J+ _" c" ^$ L, ^+ u$ R) b2 _: r
0 [' S% b. l& a# E & j; g% ? h6 Q6 O( M- R5 I/ h
( |' f7 B& W$ O
查询结果
+ n1 j, U' H9 w' P4 g1 O# R- T0 \+ w. ~+ o& k, ?( L
5 s9 I) X% C" J7 v( ^
6 {- b: b+ G4 m) W& L8 u5 O0 a; C+————-+
/ |3 ?1 {, T# y& d) ?7 B% j8 t
3 Z' y# ^! b3 ^$ E3 Q+ T7 q| b’01110010′ |
2 A. T, V( k" _( C, }7 I; j4 m' o+ e0 i; S ^& {/ S
+————-+
& y' n& c9 x- d. h+ C L. D
) i: w$ i5 A3 N# |4 Z| r |5 |) ^" p( \2 b3 O- M7 w$ M& A& b
* M$ e# h6 p1 l8 P
+————-+
8 R0 y6 `* F- J8 I5 [& C7 M$ n8 K/ I0 x0 A$ e
1 row in set (0.00 sec)9 [7 F2 i H( W. \
- [7 V# h$ R/ H* {+ A5 p% ~) _ 3 N# I8 l2 i% W/ Z9 Q& @2 ~
1 O- U2 a+ i% C# x这样我们就获得了user()的第一位.其它位依此类推1 E6 T+ H. m5 c5 s; |) f
$ ^2 G, J& K; n$ T
|