通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
- F1 X7 u+ R, t$ p& O, s2 B% b( M" [4 ~ Y" ~' ~+ Z: I3 G
+ s7 i$ h# Y* N s+ o. {9 l" U x( O7 J/ V9 [' Y G
下面将以查询mysql数据库当中user()的第一位为例:
$ t5 r7 I4 c% _% Z7 ?% T: \7 X7 r0 |/ \8 b/ E* b
5 \0 U$ }4 p$ a3 R! p% R! Q
# \, h( W" [0 L7 Wps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)2 _0 p( P* b0 e$ d, x9 O- Z" Q
6 Q$ t k9 j( T$ ^9 Q3 R% T
3 Z0 |5 S% j" o! |
' [& x5 D# Z! B; I( x首先执行如下sql语句:3 ?- h2 J* [8 U4 c. n. J
+ D$ F+ L% ?! G: B9 L. W2 [8 U1 N
: @" z! c2 ]( ~( h6 {; T; |
0 `" |: b7 f7 B P
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;: C q+ P9 \+ Z- \+ B
' @7 q# {$ o* X; F9 I3 w
+ p C4 x6 O& O- {" j( K
8 {2 ?0 D. x; T% J8 f' m我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
5 Q S& n6 F# F4 E3 N# S5 R b' p4 E7 }, I
% T& u" }* {6 v$ J0 U. W* K
% N' s+ \- A* A9 H& o
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
O. G, Q, @# o& b( Z
( W5 j3 D: t* @4 j! I7 S$ |9 U5 Q; E 5 q# g5 {- a( D+ ^% B) v
) P/ b1 e& x. u! |$ c, u如果运算结果为1,说明第一位为0,不为1
: F6 A# U+ I& ^5 z* C0 k. W( ^$ z" x- l" t. T( a( B( p
. w0 c4 y. [& x) [6 p
/ ]( ?; i# I0 \) n" j
+————————————–+* M3 R# a! D7 f- Q- W
n( U2 e7 @6 Q E| (ascii((substr(user(),1,1))) >> 7)=0 |2 M6 o1 @. b/ o- W4 p9 s5 g
; u3 ~ b( N( ~% [2 w
+————————————–+& r3 D8 H% `2 W" x F
+ b- p p( m6 L! ?: g
| 1 |; D0 @6 U! r y# d: w
q( w$ l- O3 ^# W
+————————————–+
! |6 z `# I* K4 ?4 ~9 j4 N/ P/ G& |* ^
1 row in set (0.00 sec)
( i. L( _) P$ a' C/ w( o; L2 \: |9 ] e3 L) ?/ I7 i: T# p
这样我们就确定这个8bit的ascii的第一位为0
6 _5 r7 n0 [+ M% G, D+ X# w x4 E s# \; l; I
: p! k; O' Z! i: i! I
. o+ Z3 _, a! }# R1 F$ W* H' |第二次我们来做6次右偏移来确定前两位 e6 R4 P2 C+ u0 M$ d
1 |% K( N( t( X; d% l
# }0 B' Z9 o9 Q$ D. t* E" b( f e' {0 x# d' C% i: i' M
前两位可能是01或00,即依然可以与0做比较,
7 y5 X6 p @' ?2 m# A
2 f! {1 A, |7 Gmysql> select (ascii((substr(user(),1,1))) >> 6)=0;4 F. z% Y( ^" Z. m& @' h
. l9 _. R6 G. e1 r+ ~# U+————————————–+
) y, ^! S5 o) a
5 L1 S9 G# @2 Z4 S' U/ u| (ascii((substr(user(),1,1))) >> 6)=0 |
. o" A7 ?7 a$ {1 g) g$ J5 K0 r) D5 [: R% E8 p" ]
+————————————–+& i0 }8 F- }+ w# p/ ?! @
^/ W2 Y9 F9 _6 r) @, F
| 0 |' p" {/ o' I/ M9 V4 z9 |2 P+ j
, E$ E2 V3 y2 g! D8 {8 K
+————————————–+- s' \+ x. G L9 [* X, x; U
" a4 J9 R x Y* f1 row in set (0.00 sec), E; @9 o3 p$ A% A6 S: B, }4 J$ _
; q& h$ }' I/ t
. y$ X o- |- A# u* ]+ s( p6 m" f: o8 r& P
结果为0,即第二位为1
3 F) r1 M+ V+ Z% r0 H: H% Q0 b4 D! h* c6 I, x$ d) u& t- W
$ N9 l2 O. o5 |( S. T& p3 r: t* n+ A P% Q
% @' r& T( X% ~1 E- i1 ^# |4 E
开始猜测前三位为010或011
5 G$ U8 ?& A: g" ^* C" K6 ~6 M) L1 g, h8 X3 u
$ {& y, `$ g$ u: [
' ?3 s3 E4 P3 u! i4 ~让我们看看010和011的ascii码是多少$ c: ~0 l& p" z$ Y" h" v0 b1 {
5 ~/ d! H1 M: Y7 `" W; O
f% W3 H0 D4 K; o9 y4 |# j- ]1 G" n
分别查询select b’011′ select b’010′
% a8 k+ R! s3 O* o# D9 z( Q6 N* H' r* e( x
/ ^ ?0 P8 _1 A+ Y
4 e0 y& ]+ z7 i0 G! W( F获得结果 010 = 2 011 = 32 `: L& ~" `8 s) u
* b" b/ L5 K5 m6 E3 _
) ?& R; F* H8 w" d/ P7 N8 j9 R9 }: E. t5 \3 u
执行如下sql:" m* t1 @8 o y3 ~. z( O
* l, {" ^+ F g9 C2 P6 T4 R
G* b# Q2 a# \. n @. ^6 E
9 v) w4 H* q$ o% b; _mysql> select (ascii((substr(user(),1,1))) >> 5)=2;! }1 L: x& o: y
6 w, W+ d# D! @% E* Y
+————————————–++ R( w! r. U8 `, U+ O0 G* D [' E, p
1 D! E6 K% s/ X$ W$ {1 Z$ _. }| (ascii((substr(user(),1,1))) >> 5)=2 |
7 _! i- }$ N& Z0 k; v f0 V7 p: n& x# b( P
+————————————–+
, }( [! A4 b0 _# W& R2 `5 C# K$ E
| 0 |5 Z! G+ N. A: M( q1 \, a4 Z
; \# x: E% L6 U+————————————–+
: Q+ M# Y, M+ Q7 O. T2 n2 o# m3 P
9 d& w+ ~5 h# U9 y7 _# _即前三位不为010,而是011. B1 E3 }, B0 ?
8 ]8 J1 V8 ?; G6 S, l " c) q' z: F0 }4 T
) _) N+ u( k l' p. Q直到获得最后一位7 g4 l+ ^- J- x( L* y) x
% j: s( b6 Z2 g
; m% v, K2 U3 ?3 n8 ~6 Q
+ x, o9 m5 X8 s! E+ n$ }最终结果为:01110010! k/ j( {! |3 {
7 s$ h& P# k; P3 L# a+ W* n& c
! T3 ]: D6 v* H) J" x& Q
( v4 v$ j( r* B6 `5 P转换一下:& S. Y! P# w1 t) N4 N6 ^4 o
1 R3 k% q0 h$ L1 B) j
0 }! L: m- }9 {( i0 B6 a4 z3 \! f3 }& U$ p
select b’01110010′
. x3 W, Q8 A _0 o1 C6 f' p/ A
% [2 e; C6 l/ h" T4 i( @$ F
/ D+ K+ _# ~" r2 F
- F: u9 G; q/ V6 S1 P查询结果
# F* ?, v9 W P0 X% S2 g3 i# K) K* b4 G, v- `% n' _: h: T
5 Y- w% j3 r: h0 k% K+ n9 [9 b0 G& m
+————-+
" X- [- H% o1 @% `, l; w1 g0 l& r0 J. f: q8 m& x
| b’01110010′ |
/ ^! s3 \- H# c7 n* _ f o5 [4 g
6 H' `9 P9 K2 G1 O; G% o+————-+2 p6 \5 P! r, F6 ~
1 d! {1 N2 h% W% N8 G| r |: A7 S6 D; ^! p# `
9 e% `( n' E8 l# g$ j+ C+————-+) G% P$ A! ^/ [
# n N' `% a. o) U0 Z1 row in set (0.00 sec)
7 | D8 K5 l5 f( ^) [
0 b3 _) E4 Q9 p+ a: _1 \ 8 Q2 h1 e$ b* S+ C) h. `, K7 r
& R2 `+ `6 h) Q1 y+ K. M这样我们就获得了user()的第一位.其它位依此类推. W7 |: _6 Q! {# ]* |
, p6 F1 @' C- V1 P7 [: T; B
|