通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
' `1 `5 x1 R y" u. t
$ O u0 {0 |7 o6 ~
2 H d+ [; E2 | [ L% Q7 i6 R$ S2 y& m' U
下面将以查询mysql数据库当中user()的第一位为例:
: \- v: [/ _" f2 }0 w) p S% L6 L. O2 g5 }
. H1 e: w& o H" x1 u& l, ]6 Y& b; O8 z' i
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
8 [7 `% q' a/ l% \. V. N, s2 C4 j6 S2 ^; d
. ^5 N0 I# w- a
0 @. s3 b, E& r0 G/ ^- G5 x1 I: n' i
首先执行如下sql语句:* T6 @+ o5 i# X; r9 ]
|3 W+ N. b# w( ] 2 ^ |$ j) p% a2 i, [( E
6 G0 ]& v% c' B4 [2 q2 @! i! Y4 H& Z
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
% n, h) p7 K( U6 g* F% m3 ?: d, y' h: \, U1 {
7 p, c1 L O% }
) \0 q/ c; b9 b
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
6 t3 `6 h! {4 @' j& W# x3 Z; ^9 }5 e3 B% j, ~% f# b. k4 q
8 U8 V1 X' h1 y9 s3 p6 A: ~6 O0 R% z+ e, K
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
. U$ ` _9 q& C% ~5 Y. L& t* {. ^1 A7 f- c& j& r: s
7 N# _% _" J* x8 L$ C
& n' R, `0 t, P$ X6 d5 K. c
如果运算结果为1,说明第一位为0,不为1
* v) z" }/ o ]% |/ i+ V8 R9 S+ f9 ?7 l
% E+ P; e [% ?0 l$ _
/ k- V- o3 C3 F+ j3 L, x" N# B
+————————————–+; Z, k4 z4 f1 m
3 i+ I; p% z4 g$ u6 G
| (ascii((substr(user(),1,1))) >> 7)=0 |
" a( C* H5 p+ s8 s1 y3 S, X) m* h' v3 C
+————————————–+ u% u$ \$ _* {
& b1 d: B4 ~7 @6 S9 Y# E
| 1 |
( Z" ?. h6 W* }# k' S% {0 t6 S3 F% _+ H. e. N: S
+————————————–+
' |) p- h, d; P. `
- G9 [9 v& o8 m3 G3 J1 row in set (0.00 sec)
4 @6 {, G. k, Q6 j
1 V8 P7 l3 j7 g这样我们就确定这个8bit的ascii的第一位为04 n6 w. s) {6 M, `! `& w- H7 T& T
) A3 h7 M7 D9 v, g' D
% {; K- w3 {- `( h" a n
* ^+ z7 D) ^ k4 i- u第二次我们来做6次右偏移来确定前两位
) w- P3 p8 U, y, }6 _. H: \5 G
* R( H4 A, ~* J/ x, k, C8 I 1 O! C' P8 u' _, \& J% p" m
& R$ {" y& v) }8 ?. p5 C( h" [, h; u+ f前两位可能是01或00,即依然可以与0做比较,4 y0 e, V5 i' ]1 B+ ?
, b" s" {5 Z/ u
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;0 Z# b3 |" |9 B* G; Z) J$ e
7 P5 s$ n# _: C9 q* w+————————————–+
& U# c5 t+ }4 j0 q. W& s# H# O- B' i+ k1 F! \0 Y* g' Y" B- a
| (ascii((substr(user(),1,1))) >> 6)=0 |
5 ?- o( x1 B3 h% S/ S+ H' Y
) B, K O; Q: V X' G6 H3 I+————————————–++ [3 {4 B% q [8 \8 R. s
& t w2 g( ^5 ^1 h9 [ p| 0 |
3 O! [% u% E5 r8 f- f, p
- o) D- v, [1 ]! q+————————————–+6 W# Q T( q# n {) @8 ^2 f% n
* g9 ?# w% M) G" ]1 row in set (0.00 sec)) c5 V6 P4 C3 H5 @
& {0 i# b$ w( T5 \6 B
+ l! s1 E1 z' C( s3 ?7 V7 W2 E
% t6 u4 t b' I- M9 c, q; o3 F ~2 ]结果为0,即第二位为1
3 V6 l& ?8 V6 J. [. z2 N
5 O6 F5 b6 E3 ~) f # g* x3 w8 U! H3 t6 v$ _
1 r. i' [* \% Y5 P" ]
开始猜测前三位为010或011
, g; X4 V1 ^1 f- `6 s9 y, z
% i- u! V( R0 u" F p: b2 t8 n; }1 P2 K9 G% x# V# f9 c* ?& h! W
1 v/ n0 g5 ]- u让我们看看010和011的ascii码是多少- x y( M- o9 L
8 T9 b/ g. D7 M% L/ w% B
. M- N; D8 I4 O' i* Y3 W" X: I
分别查询select b’011′ select b’010′
. n5 Y1 V- ]$ V$ k1 N5 ^: z" A' P8 v7 D# T4 q8 L, \0 t
4 u' v) M8 g! h) r5 E. ~3 o5 z- j/ a2 F; g3 t5 A
获得结果 010 = 2 011 = 3& l) I* h/ ~) n- B
0 l3 a( l( B* i5 a% X0 S+ a
6 N& c4 Z- d, V7 C
" L/ ` `. C1 h1 E4 }6 G# A执行如下sql:5 ^' y- j6 C! ~5 V+ k" q
" _1 u3 Q8 E! x
$ c3 @. G/ \* L1 V( u
1 P2 g& ~3 y' @
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;. c& {" h2 j( |( u
4 e* g$ D w* }- i+ w5 e+————————————–+
' S* O% k* u' N1 e- I, J1 B4 i% U* s$ \% ~* _
| (ascii((substr(user(),1,1))) >> 5)=2 |
* r8 l0 D& c9 B/ h( o3 A/ s- }7 @+ Z8 ]1 U* W: ]
+————————————–+1 _! R* d& H9 I, h
" h' z8 O8 e8 n! y
| 0 |( k" s* S$ u3 p/ S' `8 h
9 n( i6 D" E6 Y6 p3 ], y
+————————————–+
) A- V; z/ B" g4 p6 n- _; q- s V3 a+ u6 v& b4 E
即前三位不为010,而是011, Q. X! P. r' L: x4 r: a
) @- ]4 d( s! W/ ?
9 C) g) O+ o$ |: ?7 R5 z/ V: T7 z! t$ o7 X
直到获得最后一位
# e% Y5 N5 S9 \: K8 Z8 X! Z+ }4 Q
* e2 _0 Y3 c& E' A e% R
4 D$ T- S- u/ {3 l
最终结果为:01110010
( @+ A+ ]6 p* S3 K! g
" E5 v( B' S- {. G
7 B: p* q0 O6 I
+ _$ m" U# C P0 a" H转换一下:
4 v7 m+ H9 Z, }+ G2 ^5 ^ ]4 C* x9 K- M. h( a+ ?$ r6 h1 q s, A
3 u( C* a( R% ?4 R# j4 k Q5 Z; X6 ?4 q& K
select b’01110010′
5 T N) @/ ^) l7 I( }* \) G5 f* S# {+ d! U+ t
0 q2 ]9 p/ V4 f% G1 [
7 ?5 ~/ |; b- n0 G! E( L
查询结果 s, B/ m1 J4 \) {+ N6 Y. f% M
$ s' `+ T) p7 q( n
( R: M- X7 ~# b& S A& N* N2 ^6 a' o- N7 ?6 M
+————-+) f F# D% s6 R
2 p* L% Q. r5 c2 V2 ]! F* E" ^: h$ A
| b’01110010′ |! S8 {9 O; F' d D n1 |
: t/ D Y* g2 @, q5 F% {
+————-+ V: I$ D: u9 _
1 a: Z n f. G
| r |1 f9 I- `5 F9 H6 H ^/ L) A
: G4 M* A7 k9 q( h* ]. a+————-+
! @- x0 j+ @( z+ N! |( Z; Z
1 `8 Y; r! `1 R2 W1 row in set (0.00 sec); u. s+ x- X2 I. Q8 w9 u G$ U
/ `4 s7 W! R9 ?6 x# M
9 g+ a2 [; ^ K9 X C% N( M
0 y4 o/ p, X, d& O* t这样我们就获得了user()的第一位.其它位依此类推
: q: R. m9 x1 Z3 A
" K" a2 N7 h( @5 b ]/ z |