通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位1 o" V( G, R" j3 f3 X
! `9 z+ e+ u) n; @2 v0 h% w
' y- i4 T2 m* F: J( S; U: J% O! Q% ^, c9 p2 ^) j6 O( A) G: V
下面将以查询mysql数据库当中user()的第一位为例:
! u( L* h: X2 y. D* G, [
6 a C, U% j0 }! ~0 B+ D; P" ^
" u+ U2 `6 R& \0 @$ O* u% _0 v7 s% O+ o+ u& _
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
% }0 y: b# B) U2 D( l
n6 Q/ r. l: m3 ] J: c
% l+ }7 `% y6 W9 F3 s' n: x1 { V b1 R: X
首先执行如下sql语句:
+ Z) }- C/ b. ^5 [, _" P
U6 f: U6 c! X M- | " X Z2 ^' P5 N8 T. Y
: F: t% [. L, K9 u0 emysql> select (ascii((substr(user(),1,1))) >> 7)=0;
1 t6 p2 ^6 j! v/ V
1 F0 h. F3 U6 @/ Y0 l# O % O' N+ k( p# Q9 Q; U
# S8 s! X$ ?4 P0 t6 Q1 u T
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
6 S+ Z. Z1 J( N8 R) n- J. X- |/ H! S% E5 F' M2 ]6 M2 R
1 ~! A ~, N" e" M- k9 o5 b# `
; S# c& V: u( H+ |/ |( f: P
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为16 y/ w; @ X# D( B3 r/ A) t1 V
7 P( s5 `1 x# ~# v' f3 a 7 j! B7 D# N$ k3 u- A, e
a" e: z8 _) u; u
如果运算结果为1,说明第一位为0,不为1
/ H2 B V( C% o: ]* c6 j5 K5 \: X3 e5 g8 v
* n& B$ k; B% P+ J3 o
$ c" _0 }1 ?" u5 d, V4 {; e4 K+————————————–+
2 ^$ {6 \0 W* G: Y) G
3 K; ?3 Z# f; c( k6 D$ O; d L' a| (ascii((substr(user(),1,1))) >> 7)=0 |
) l; m1 B* k% Y7 O7 x6 \7 r3 F. V: e* z. s5 @
+————————————–+8 A; P& x. ~2 x
3 O3 A# C- Y: p& c/ ?2 w: h9 k1 P v0 p
| 1 |* D; v* D' \! |- R9 M* r) ^
. z! q6 s, _$ P/ n6 S
+————————————–+, T) e3 w* z. N* a: B; b5 Q
3 c' c8 }3 B( M$ J+ }, |1 row in set (0.00 sec)
0 l) O' O# f5 f* q- n0 @# c# V7 |7 f4 x$ r
这样我们就确定这个8bit的ascii的第一位为0
0 f! p8 G1 K/ e- t6 b8 p
' Y/ t. h$ x( ^& ?% s+ m % a6 Z6 t1 z9 j" x, m; _: v
7 q/ Z% ?4 b( ?' X: p
第二次我们来做6次右偏移来确定前两位
( [/ J; R3 M+ m& {1 F# ^' y
2 t* O- J9 k: i. W5 B; O0 Y0 o* \ ! C$ D* B2 P( b M, [, B' B
& m6 O$ d7 Y8 v5 t& f" G. {前两位可能是01或00,即依然可以与0做比较,: w- e3 v B; K! N2 \5 s
$ L/ }; F+ E6 Emysql> select (ascii((substr(user(),1,1))) >> 6)=0;
# }! a! t2 H- l& N
% H# F$ |7 {+ {# m+ D6 z+————————————–+$ ^0 V7 z8 {- p% H6 b) L3 O
$ c4 a* }! H. D
| (ascii((substr(user(),1,1))) >> 6)=0 |
4 s, ?" \3 K/ {2 P! S7 }4 J# p
: a3 s' h6 d* C8 k3 D, \ u+————————————–+
) q1 [# A6 P `8 b
) Z+ u, c. a+ h0 w" e) x" d8 `! e| 0 |
, O4 K4 F0 s3 x/ W m) D9 ~+ b
0 ?. H8 G" v$ e. d2 _3 _+————————————–+
a* b: O. k( S) r( E6 Z# m8 j0 H' F" X9 {9 q# n
1 row in set (0.00 sec)
5 p7 W. C, C I. r
" s, f& t s- G: x6 e
* q9 }5 d) g! f) f: ?
) w' L# `2 p. U结果为0,即第二位为11 Z8 a1 V7 N) h* G' D9 E
& U" Y: h$ c) F0 i- G! i! x$ T
$ h; x7 g+ M9 u; }/ ?# n
2 ?: E9 o/ f9 b: j# y7 G8 b! v开始猜测前三位为010或011
6 s5 e5 k% e8 o6 ?
- w5 H; x& l2 M- x% Q" d* U
3 } l" f# n( L g( q0 k8 Y& c4 ^+ e7 G/ _, v
让我们看看010和011的ascii码是多少- P' Y" i1 k4 A. K
1 {7 d2 I0 e- G
7 N8 O3 h/ ?- n4 m0 p/ w8 G( y
2 e1 g) I8 y6 x; @+ m
分别查询select b’011′ select b’010′
7 i+ D( R/ P# o% J* z h
) Y& I( ]: y9 r ; I- E, L/ }8 e/ s' B
$ Y4 y8 L( T( g: m& }6 }获得结果 010 = 2 011 = 3
* h ]* O. M+ J& }- J" |# L E" J" U5 @/ n! K" ?3 g7 Y! d
; P: M% }% } N3 W
# t" t* m7 |: h# D8 F4 ^+ u3 [执行如下sql:
# ]7 S2 d6 }. p/ U( U6 V
5 R, v# l0 j; C" f ! x- G A1 D$ S/ s
9 T' L5 y/ y( W7 A' ^) nmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
. S9 h6 e& P1 G8 W* W# g
( L3 [. |6 c& E/ k* ?1 O/ E$ [& ]+————————————–+7 v2 O$ M7 b9 }, ~2 k( l
" z+ m5 [" f/ C! O2 v
| (ascii((substr(user(),1,1))) >> 5)=2 |7 w8 a6 }- ]( q; x; n
7 u4 n% [( ^, a) B7 J
+————————————–+4 b- ?5 b3 U( G
, w- d: T5 I* c6 a+ t0 j
| 0 |
( @2 x- }2 B7 L l; _% H' R( z3 J8 P. l o+ }. @# t; Y7 p
+————————————–+4 Y: A, Y( q+ }( v( w6 t
# U0 v3 ?7 N5 M$ W即前三位不为010,而是011/ g' B) ~+ j; [8 U; q
|' O! ^- S+ Z# R: s$ b
6 O1 {1 f& }1 h, D& ?1 U. Y% C1 M! g* D& n' x
直到获得最后一位0 a' x1 r8 B7 P X% k! L5 H
, Y3 v# I; @7 N L- K2 Q0 f+ v
+ {+ n# r( Z9 {- \) l8 E$ k3 h8 x% @! T& n0 j* x) x4 S9 B4 g1 H
最终结果为:011100105 P+ f2 R1 n: y/ j# c
3 R" q5 d8 {" n' j" S
+ h" B4 f8 A: ], @! k
5 A1 M3 P: q# o) p转换一下:
1 b- @# e5 }1 k# P i, K2 a. Q) U9 I1 j9 F6 @
/ @" N; ^7 E9 ?2 s- G
! M- K6 e. j4 y3 W& f
select b’01110010′
! S, Q) c5 p) s) O
8 z. F7 y6 b! L / f& ^5 n% P5 Q( [( u
. |* \* @* W" P0 F5 q
查询结果 \* d- }4 x' z* F2 l0 y' t; d2 z% ~/ S
0 M7 U# h+ r; C) ^7 o
" ?$ E0 ]+ h% b% a. S. x- X6 u0 z8 B, D
+————-+$ h, W M% }: z+ K0 x9 c. V
* E1 i |& c- z; w2 a4 N
| b’01110010′ |
* P0 \8 d+ X, v ~7 k
# U9 ]: l# r2 O+ V5 D: c6 O) L+————-+5 a' U) z% @( ~& \( y/ W% \
& f* z- p% A" U8 b: k. s| r |
9 \& R0 e. W( q
[+ G- F( a3 @' [ Z+————-+. a" W5 N: Y2 ^# Q: ~3 _7 e# S( R
3 x# }5 m/ p1 [5 a1 row in set (0.00 sec)
6 H1 d$ V0 S" \, a# W1 ]: [1 y/ l
9 ^+ ] `7 q& p5 o 2 d3 \# R9 x7 L( A3 C
2 u$ O7 o7 k* ^" B7 }这样我们就获得了user()的第一位.其它位依此类推
. [8 R7 n& W8 r3 V* v0 k8 m; ^$ F: r! {2 m6 k
|