通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
* S3 R* e/ O8 }) z0 F& W/ a/ z* n9 j- Q) q& O
* O5 M! |2 Z. y5 b
! {8 m& C" g: S下面将以查询mysql数据库当中user()的第一位为例:
3 U( X8 i, A6 x( s* I5 g' m/ v+ A1 C# P7 M- X& i
$ @6 q. }. r d0 x
' d' V: q0 c ~# g5 Xps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1), U F/ h! ^1 ^) z! Z0 P+ M7 W
C- {4 ?3 u: e: k3 R( z8 [' k
. M3 }! W C- P% W9 F; k2 I/ P% ?7 I* b1 E# b, U3 s; Q' f
首先执行如下sql语句:
~) w/ t$ o4 o. Z: ~3 [7 f1 g* C$ t! ` S, ^& P
; ]7 R( J! E8 t7 f$ c; c b
. S5 V; V. X, x7 j/ D# @" ]0 Z! z" _mysql> select (ascii((substr(user(),1,1))) >> 7)=0;. Z6 [9 ~) T( L! O& D0 J
6 ~* o! x" w) _ q" U1 q # w E+ a" \$ J& b; t0 `/ q
6 G4 W7 C8 }; C! ~5 K% x/ b我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
+ r; t' T+ q/ I1 l2 \9 @) O
! L5 t- r0 l9 h+ r6 s / T# E0 W% d8 f' C0 a& x5 S7 P
7 b7 \0 ]0 N9 @+ E }第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1; Y& @, M- H- [" A; q, y
9 ?4 p1 U/ t2 b" j4 c& j 7 a6 |% O4 T8 D) U
P) \, v1 O0 e$ v0 H
如果运算结果为1,说明第一位为0,不为1" o% {# p; d) ]3 Q
. c% w7 k5 a B. N9 Z
# b' ]6 p' S+ F/ g8 j7 B$ l$ L; ]
, s+ s) V- B. [9 [+————————————–+
2 z6 B$ ]0 M2 a9 d; N" u2 s4 G! h) `1 t: q* Z
| (ascii((substr(user(),1,1))) >> 7)=0 |. B' D# a8 H. y- ^) ^
% r; { P. o' g# A# p3 P- J
+————————————–+
7 `/ ^ [: K& B2 g
h7 n9 `# f, ?| 1 |
2 s! z$ v% m# `% E7 ]. M; u% G# e* ^, u5 @
+————————————–+
8 Z: {4 x2 m Q# t1 L; B" L) H0 X) P! s4 o
1 row in set (0.00 sec): _. K$ E5 M. b' |/ h( T
# `% d2 r' Z9 v! x# S* v+ j. r8 W
这样我们就确定这个8bit的ascii的第一位为05 K2 H- \' O1 P9 c9 Y9 _
/ O! o' }$ X5 s0 ]
: E: |& T# d# b( q0 M" P
) }1 ~( f& N$ P0 G# a1 X第二次我们来做6次右偏移来确定前两位9 b3 x6 q1 V0 G$ F
3 M6 O, G: M' @5 K7 I; P
8 I i& I2 C. i, u2 o! f' e e: T) G! H" r5 K/ A# s4 X6 R
前两位可能是01或00,即依然可以与0做比较,
* l/ o' }1 l7 S" K! _* i: C& V9 }9 o9 Y/ G9 S8 x! n2 L
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;8 ]. G& M& C! i" b- L* j
. Q3 V3 n4 H5 y+ b3 D! Y8 f1 t+————————————–+9 }1 E9 X, w$ G% r; I! m6 R$ c; Z
. V- D" ^. I1 ]1 Q| (ascii((substr(user(),1,1))) >> 6)=0 |3 a' I$ f+ V8 F* z2 N" f
" W- V% P5 A1 h$ N+————————————–+
. b _4 v+ i$ \$ h0 ]+ l8 j% Q' s1 l e4 M! Y
| 0 |
5 b4 o7 A; c1 e' l; @% ]
1 F7 }+ l) ~4 s! u$ Z, T5 o+ N+————————————–+
2 R q! `) E3 v, I2 V/ b- u2 M4 F- c M2 g! }
1 row in set (0.00 sec)' t/ @# N4 y6 G7 |: k
% o/ }5 z4 _" ?. c* T. j7 G, R
% E* Q5 K1 ~% ~8 K' ?1 z/ B7 n" ^/ @: C4 o, q8 Y0 @" f
结果为0,即第二位为19 H. ]1 _% v1 {, Q$ r" w& p
4 k% `5 I/ x0 j$ t6 X! w
: `+ {" f+ l0 [2 s% O$ m
1 ?1 X/ H* }! ^# z/ d6 L6 Y+ p
开始猜测前三位为010或011
, [. k3 k7 Y0 A3 f
/ ?6 s& q$ J5 H! B( v0 | % q+ p) Q1 H( t2 O" m7 `, M
- C. e# c+ _. b2 ?2 c3 s5 Q
让我们看看010和011的ascii码是多少; [/ q. S3 N0 I7 @/ E
c5 Z" d+ Y4 l
/ S0 d- b; @$ D% f j Z6 q. K3 m; K( p4 S( s8 D X4 l# u9 X
分别查询select b’011′ select b’010′
; I2 u' z) ]/ `0 r3 B; v. i# Y* E- n8 |4 o% m R2 {) n
; i1 B9 f" S6 R+ m% B. ~
4 \* ?0 Q/ |8 X7 A! K ^获得结果 010 = 2 011 = 3
6 |& G4 q5 [+ D9 h Y4 o( A8 z) q/ Q# R+ q2 M5 E# x1 b, t. B
7 ~) |$ P o2 B, Q- P, v
( z* _% X) G5 c0 k2 _% Q执行如下sql:
2 }6 X$ ?6 ^9 I. ]8 q7 U
W9 U7 d& b6 j/ T5 H: T2 s
! _# c5 e! r7 C9 o
; u& k2 L# ]$ F6 m! M1 T; h1 umysql> select (ascii((substr(user(),1,1))) >> 5)=2;) y3 K# g( |2 C i/ u8 z, N# @
: E8 r9 \% ]! j( n3 W2 F
+————————————–+
; J# Z5 q3 a# H* ?! A) B( A8 ^! F6 L& Y$ Z* y1 V
| (ascii((substr(user(),1,1))) >> 5)=2 |9 U K: _" D, u- P, B. ?( v
0 v0 _- z! Q" l
+————————————–+* c, N* ?( _+ `5 w
& _7 x: z5 R4 K5 S| 0 |& Y0 p4 ^" H3 } m# e9 M8 D
X+ @4 Y$ m# s3 T' ~
+————————————–+
W2 e7 C' c9 D% {/ s1 {
: |) I, T7 n% R5 t! ]7 f% F1 p即前三位不为010,而是011
5 W/ W: B& w) E( x0 O/ A
- C& K, M/ ^7 \) F + V5 A2 U, v5 i" V- Y
+ N; S, S! g( g
直到获得最后一位) t1 [( {3 Q8 [3 R
1 K& ^: _; U$ [! I: a a
0 l o {3 K0 @- Z$ Q4 q3 t
3 g T9 U) [, ~: l0 G最终结果为:011100103 h5 v: D: W1 a O
5 B; y# D& E$ @& Q
! S$ ~% v2 t) k" [9 d' Q; h( u4 ` C& r: D7 V4 t
转换一下:* J; {) F1 E% w2 G& j8 p# h' x
3 V+ c8 z# j! y8 k
+ ?2 O5 S. _, \' C3 Q8 F) B+ y; E- ^. W8 d7 b. w
select b’01110010′7 \& `2 L! S$ b; }5 n# K
" [% }. }2 u0 a
" w+ B/ {; J3 ?" g8 `9 }. u5 x, \6 f$ x! h& I* X2 [' {9 A+ M
查询结果. @' k" u) M: }4 a Z5 K$ O
: w3 {+ V% T/ x
/ }' \1 ~( i8 @0 l7 ]5 x* b) T; g* J3 f0 m
+————-+9 I e1 q1 V# v3 |
9 R8 z0 q( d" P" M, p
| b’01110010′ |# i0 m1 F c4 K2 N. {
- Q0 X5 o) `2 o' h. Q7 u; `
+————-+
! U% r' [- U u! @7 U! B+ r& Y* ]5 c K; e) k' }
| r |
: O% ?# C6 g( U' c2 l" W6 [( \+ ~5 _ a/ s; m
+————-+( o8 t7 J4 _# h
7 j) B: ^/ v* s% \" z7 b- ? k% g
1 row in set (0.00 sec) U9 I$ K+ C5 N8 j$ x/ |
0 Y7 }/ R. [, `5 Q' I% r
& R) b( y3 r o( f1 V* H7 q/ r8 G+ r+ [! e1 ~2 S4 w& c
这样我们就获得了user()的第一位.其它位依此类推
" \: e1 H! l( P- K8 V9 O! F* h* q K V8 t; _& y. B' X
|