通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位2 B ]5 N* }9 e% p
# D8 |' J2 Z y7 V/ I8 u3 \ ( N' P- M! X C% X' ~
' H; Z! i: N, U" t6 i下面将以查询mysql数据库当中user()的第一位为例:
1 _/ N; }; M* S( W. P& t1 K! I) w7 x. `6 M5 P% h& n
3 |+ {4 ~9 T5 A1 V- S. N7 t/ D$ R5 O8 Y( }! E& @, G8 R
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
. D) v1 R7 H( \5 q; E7 p2 }" j9 |; F- C. C
7 q# L6 N2 u: D; J! O( ]' Q. D, ]! B+ F2 O$ Q, @" P' p
首先执行如下sql语句:
$ e( q6 y+ W$ w- K9 [ V5 A1 I( L, S! ~- y+ d9 x) \0 W" O3 d
0 w) p, L4 \) t% p0 [
$ \1 A) j( G9 ]& e tmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
' S+ H x' `2 b j' G! b9 D( |
3 r1 `% G- k; W6 E% V1 P E" Q
, A7 y# V4 v5 Q0 G
5 ~0 S8 Q- G/ u) B2 o8 W我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
# J3 u0 x# {3 N" w" \" ]8 c* N& t0 }8 M" R: x" L+ q
, d% d6 P3 `: u! ?+ Y" S/ ?+ W+ ^/ ?9 X* _5 e7 d% e9 B# |
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为13 J+ ~1 h: I% ^, L8 d( [% L
& w5 f5 m+ t2 s7 o
3 V; Z' ~7 `* _ B" A& \0 d5 \2 U n4 Z& `6 P d" O3 R
如果运算结果为1,说明第一位为0,不为1
9 C. [; K4 Z0 U* M. Z' z
% A# p7 e) e9 M) i
( Y6 ]6 S1 y7 s; I+ H( q+ x: O5 {: f0 w J) P# z& K4 S) ^6 j. E# ?
+————————————–+
$ D/ Z5 `* o4 N) v8 s) M# ]& \, y7 D# s) P& q* g% r; n
| (ascii((substr(user(),1,1))) >> 7)=0 |" p% ~8 j2 j8 @# T6 _
9 J( C0 W1 N2 g2 A0 B2 W+————————————–+
) L% m/ T: D6 S- B- f- x1 @& S& z9 W* M) N# P' G k, g9 l
| 1 |
8 k8 T, A+ a4 y
. y8 U4 h. p; ?+ \. k) o9 x+————————————–+
1 I% l# u G9 a4 i. ?& R
7 w9 |$ u, A% U$ @# b" `# D1 row in set (0.00 sec)5 W7 P0 p2 P0 w$ N6 Q2 ?) T
7 O( S) ?! M7 l# B( q
这样我们就确定这个8bit的ascii的第一位为0/ n/ z9 _) f1 h3 g
& Q7 L$ M0 G' z1 s: @
# }, G9 e- a& s9 `" Z6 |' b: U* _( Z3 L; Q
第二次我们来做6次右偏移来确定前两位: h( x' z. e) f9 m0 C$ F/ E
5 `6 T* a3 \6 C4 B; G; y$ s - B; x4 ^0 |' Q. e1 @" j
* ]8 P$ u; Y1 `) e; W
前两位可能是01或00,即依然可以与0做比较,
& n, z" l3 o5 e% l" R+ L* }* l7 t$ b s7 T4 V
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
5 t4 H+ M+ g8 D: v
& Z( {$ I0 j! F+————————————–+6 y- g$ r/ c/ h2 e# }5 {) n6 Z
, K! g8 A, }; X0 b+ g b% Z0 m
| (ascii((substr(user(),1,1))) >> 6)=0 |
" n" k6 U3 }7 |- O+ s: K9 T6 g- b+ c0 }. _) c3 \+ U
+————————————–+3 Q2 t" [+ L2 `$ k& a$ V
- [# e; L9 p8 z% H9 V| 0 |
0 i$ C6 C7 F; w/ u r" [! Z- N
, _) G: t# n) n3 B+————————————–+
9 o# i# g! E) R6 g" w' b- v" U
. g/ `* s: V+ s$ z1 row in set (0.00 sec): V9 E. c% N7 G5 J$ d% ~6 @
% E* r- l! N2 I- l4 f( D8 x4 p
: u( u$ M5 W4 ~/ c3 n) d P. h8 p7 N& B! t% u; w( T4 o5 T
结果为0,即第二位为1
9 z7 R. p3 k8 Y( B: U( C6 G6 j# c& M- L# X$ w/ n$ g. X
( t5 Y7 J% M) W
/ P8 U2 K* Y) R [, n5 d$ S
开始猜测前三位为010或0119 U( h& L: z4 v
& U r2 |( G' \" m$ D + _7 |8 K) g" ^, L9 n, D8 Z
( p3 n+ i0 Q, A+ z% S1 T! \让我们看看010和011的ascii码是多少
; F: v+ y1 e& h9 v" \# Z( k+ y
C4 [: Q1 I2 O$ b7 O8 B h7 J) j; E2 n& u9 A% u
; F. Q0 ^9 P. x5 W; F. W* r
分别查询select b’011′ select b’010′
& x ?& ]/ t6 V- d/ ^. e: t2 J3 V; \% x L& O' k. v |
0 \ f9 o. y( v) A
2 N2 |! U% `, \- }
获得结果 010 = 2 011 = 34 Q6 R" O% D) @; }3 U
8 |6 a2 |. G- C% W
% c6 j( |! X) ]6 u! m1 [2 Z5 V2 c
' z; H* P& M) ^6 z& X执行如下sql:
) w- E5 `/ \( a3 A" r7 v; r5 f7 M# c; ~( {9 Q0 X6 y! g
8 P8 Q) R- N4 G" a4 K/ J- G1 B& o9 r7 p0 y) }7 H! j
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
! E$ n% j0 X3 ?; M8 R5 u& s
' H$ ]+ P7 b2 e7 i+————————————–+ _4 p( \' |8 y
. f! G; I: z9 Y6 G
| (ascii((substr(user(),1,1))) >> 5)=2 |
% L6 Y* |* ]3 D
# w& W& L, T! B% \$ p; W: X+————————————–+/ E& a) j$ a7 L- e2 [
# W5 [4 y' I1 \$ S: K) n5 ~! G
| 0 |
5 E0 I. d9 k- ?/ a
5 h. R+ ^+ j& N) J( Z1 \+————————————–+
$ D# V9 p0 o, S* D2 U) I' v/ {; l/ E! O/ c
即前三位不为010,而是011- o' ^& w! \% u. f( ~; f5 ^
- X7 o9 L9 f9 a1 Q# w H- ]' B $ \& G& q7 E* {4 B9 A( P
% [0 Z# i0 s5 I; k! S直到获得最后一位+ K1 Z* S' p6 R& J; ]0 ?
( l) \- h. I0 K9 f7 _& {* m2 V y" \
* ^" }3 J' v1 ^. A' n( Z1 `4 t# d- V# t7 S1 p
最终结果为:01110010* O' Z2 ^. u( k! ^# a! ]: A9 i
0 i+ E6 S, g1 w9 y8 G K7 u " d1 J1 L- s+ m$ t* R0 O' {3 B1 p
: H3 N! U4 I9 Q, W4 |3 B) S
转换一下:
2 m' y: F1 W9 p1 z, T1 p. x5 H1 n% t
1 j/ S2 a/ M; p5 b6 {
# m/ Y& [; F- m" `9 c# _2 b9 c) c1 O# P1 L' Z5 L0 n- ^
select b’01110010′
i; Q3 l+ {0 D8 n- R Y3 N7 m) D; ~( M- j% W# w* {+ k* ]- ?
4 [9 ^) l2 W5 b/ B& h! [
5 y3 \6 Y7 I1 D& c% c( E' W4 W查询结果
: e! [# I7 C% X, m/ F
; D' I; V4 x3 _7 p5 z" r 8 \5 D S- B& _4 h5 a
2 B% b7 I6 V k. N$ n: B+————-+, k: ^, C, o) ]1 |- y: a) h% g
1 o. K; S& r0 `# F3 d# J3 }4 t
| b’01110010′ |
6 `1 n6 K4 s% B$ ], B1 H! @
6 w' z6 R* d% X5 K6 @1 M+————-+- ^# \/ |. u$ V7 B
+ b- M6 q! m/ [! U$ _
| r |
. a5 @+ y; w: x; c: [
6 i; v+ @9 {, |* X+————-+1 r' r4 J+ F9 G2 |4 v5 x
( b7 Y: b# N. q% v n0 X
1 row in set (0.00 sec)4 y, w' T- o1 Z5 f. I3 S9 ]
, l# R% ?% o) t- e 4 i& D3 d2 `5 ^: Q; n
3 [* o7 U, k& Z2 K% }, {这样我们就获得了user()的第一位.其它位依此类推2 X- Z- P# c7 ]+ q
: z& ^. ]& b, j& \" q& \ E6 H |