通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位' Q. p2 f; L2 D3 N- S
+ b4 N( ~2 d5 p ) d7 w3 P& C. m" _) z: ~% C" z
% K T. g+ w% N$ R& H
下面将以查询mysql数据库当中user()的第一位为例:
9 \ c* J8 ` n' N: I6 L8 x- F- q: d( ]; U' `
! r) L+ r6 Y" n- f, }6 v) T3 }+ S% R+ W4 t9 A% k- @. }
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)" y9 m4 j1 n' b- i- p1 N
, f h" Z. A! j8 { 0 R8 r5 Q( n+ u; M3 C% d. R
/ x X' ]8 ^ O/ f; [3 d5 E$ g首先执行如下sql语句:, k0 `; o; f6 b( k8 I
* K, j. C0 Q- \$ S 7 [. q8 I1 J9 n" W) j% g
J% e* d" Y, w+ D" o
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
& E, x, j1 ~! t* u: a0 v! D4 o1 U" e: i1 q9 {& C
- H0 V$ i( | O2 u! g( Y- D1 G3 b
, |- u4 p1 k8 n$ C; m. h+ @+ y
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
1 G& b* g4 P$ {, Z3 G6 z
! V! C E4 L0 z+ S* d
* `' Z/ d: V4 s( Q1 a
8 r$ [2 P" T& f$ C' ~2 W第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1/ U! n2 N; x& g( b/ F a) j' O
; `6 ?! g! A5 b) E. }& r9 j
! ?1 ^! ~! Q% h6 K7 }
1 s; ~0 |; d1 M3 o) v
如果运算结果为1,说明第一位为0,不为1
3 y$ L$ V- Y) @5 [/ D
% @3 o" H4 `) Q' x $ ]' K' ~4 S4 ]3 R0 J8 ^* r
1 a N; Y9 ]- L- O8 o8 a
+————————————–+
3 Y; s$ i; ^ z( ~; h% X [4 L1 @% _; K
| (ascii((substr(user(),1,1))) >> 7)=0 |) _% s! @& _. o6 H9 \' h0 f
5 {* N* I6 F. A, h+————————————–+% p( O' l$ D0 C" W( ~% N
4 D; I* ^. _6 A9 j+ k
| 1 | f( ?; c" z- P- w; n. c& H4 G
) u: O3 Z( {; ]' Y; h+————————————–+
& T4 p: U) g! d& ^9 y
5 X; \2 a4 }$ c5 h+ u5 Z- E1 row in set (0.00 sec). f% E: t' w& u' v e
( c2 m# Y- Z7 [这样我们就确定这个8bit的ascii的第一位为0
, c( U% C5 R/ I) Z
/ C0 a& D6 A+ s5 N1 ?$ Z
; Y1 [3 E9 J% G5 ?, m* c8 ]. K" {& G. S e0 B) {9 f
第二次我们来做6次右偏移来确定前两位, B* u# h; Q# A4 o2 ~
. ^% h+ N- P, V! K$ Z6 X
9 P7 d5 k0 ^1 H' H0 l g; \$ o: u
( l1 N, N" c% ?6 R/ X2 g" \) n前两位可能是01或00,即依然可以与0做比较,
- l2 g# D" i2 `0 v
3 y! L! o6 j) \$ a, C6 W5 qmysql> select (ascii((substr(user(),1,1))) >> 6)=0;; y9 H+ C. H( G; r
9 {# g+ z3 J6 z+ V
+————————————–+" g7 ^/ _" ^# p4 ?
6 z- B5 Y) v- @& ?| (ascii((substr(user(),1,1))) >> 6)=0 |
) R8 g2 S4 I* Z1 Q& F. T9 C8 r) G4 y9 F9 O
+————————————–+2 M$ u9 R& z; |. E4 g" o
& Y8 W8 g, `& Q# h* Z, h
| 0 |3 i, ^% i9 L& a
, O. v) r6 o, Y/ n8 h+————————————–+$ q/ F1 a6 N5 y; d7 j' L: J2 I
& Y, V4 ]' d( a" t' u
1 row in set (0.00 sec)
# [' A) D5 |# `% G2 E0 x4 b" z# Q- {
: M/ F! K; a$ v5 J
" t2 X' ]$ I; J2 \结果为0,即第二位为1$ ?! L) T/ s7 ]' a2 U
0 a+ k; D A1 ~+ Y
7 X" R, w' G% M
# M$ o& b3 I. w0 z* o3 k; o
开始猜测前三位为010或011
5 f# w: w' {, E. B4 A( y
4 R, J& H- Y5 j9 \
7 w" i2 j; G. ?5 e) F3 ^
* N* h+ r: H; e$ e4 ]让我们看看010和011的ascii码是多少& J6 x1 v) e8 O5 L! ?3 q$ N
% O, ^9 ^9 i1 y/ x
1 t% n$ Q+ E l- S
0 D' P. `9 o/ @% Y分别查询select b’011′ select b’010′2 g1 T+ C# R: o3 R2 m
1 P: `- D( L6 f5 `4 A& Z
9 Y8 I( P4 t! n# r+ \. N0 R
$ x2 L) R4 \4 v1 _( E" D( ?获得结果 010 = 2 011 = 3; v6 |+ F( y2 t& Z* B7 E G. ]
* R4 d( M: e7 W ^' c# |
9 U4 |5 A; H4 n S+ t8 Y
1 d! V) p" ^* @ [2 o执行如下sql:
) K# l$ Z; S; C# R/ M* d. G, \2 o+ j
5 P6 e: c; n! j0 P' o
2 Z* v9 i. e$ D, P0 l) Y- U/ b* cmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
# l5 ]" P8 j0 g. \7 m: X+ B1 {! E% r* O% f; X( O1 \4 n
+————————————–++ x+ i6 U- B4 G
. m0 p* V* Q% I0 ]| (ascii((substr(user(),1,1))) >> 5)=2 |
. s4 W$ Y- C# X5 C5 A
" ?6 I* V" o$ x; E# Y5 X+————————————–+
* i8 v$ U y. i! X
6 O% n* w. f$ W- H3 o" M| 0 |
5 _ w. p8 T9 g( [% Q) J
) G; I! O# U6 C" H" n+————————————–+
9 K( ]/ f9 }4 v) B4 D) g" l4 e2 ]8 w7 ]0 d9 _& X U
即前三位不为010,而是011
d7 A9 F& I1 W# X4 K S
6 X% ~, B: \" J ! q8 w1 W( @, x! ^' G! v
. m0 o# ^8 J* h1 |+ [: U( s1 G1 ~直到获得最后一位
! c, U# X9 l' j4 S+ l. _) e. I, @+ W+ n3 j; Q; u0 {2 P
! |3 B- U, g9 @8 [4 _* j6 s. q7 B. |: h" k" l
最终结果为:01110010
N/ \, J6 X$ l$ e! }7 }2 A& }9 F$ j
( _$ K1 D k" k- Y* | G9 Y
( ~4 A0 t& E6 h% H! V1 m+ _转换一下:: g% N, C3 k L3 v* Q+ u9 _
) s! S- P, C2 i3 c
# n7 V4 y: ?) p2 w8 ?( l
6 E, q& `, G. C
select b’01110010′
# G% L$ ?- C. A' X/ O2 ~$ W$ k4 x% w$ Q2 h/ I" x; X* [" d
$ ?9 L; c$ g8 @( p7 g1 Y8 g0 k: O3 \ p
查询结果& [7 X. R; H7 F
& i! Z7 i, l. j. d2 c2 K
" y9 C7 V3 g, T$ Q5 }' {) ?) Y
- p& X* b$ |! |$ [" p; _ f
+————-+
+ u. z5 D! b5 a L2 S6 D6 O+ z9 H( i V! U
| b’01110010′ |: g7 E- I- S0 O! S) F
6 A% S; a- N+ a9 u+————-+
. C( Y% {3 u0 }( N5 O& U! N7 b
; ~7 N f7 k0 b7 V+ g/ E7 j| r |* j; y6 {5 b" S; W4 X
W8 d6 E2 p# I/ q5 o4 s: ]+————-+
" R3 x+ i I9 \+ W, D
: `" t6 L8 L& ?' M) D1 row in set (0.00 sec)0 w7 A' f. v$ ]: v8 A. f
j* |2 ^6 V$ |
% ~. w5 e1 C( P; j$ U6 g7 u" Y$ v* S* `0 u9 |4 x8 i
这样我们就获得了user()的第一位.其它位依此类推! G" A1 Q1 }) e
5 R9 y2 H3 }& y' f2 }% l- X1 D0 ~ |