通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位+ V* @0 f3 e( H$ Y
5 L1 D6 {* T" N
- k0 ~" b% ~. K& J7 i/ e7 ?8 v4 L
6 B& _2 I" o3 ~) p: I$ |* |2 o下面将以查询mysql数据库当中user()的第一位为例:8 t6 @# ]& P( C5 W1 a
& u6 d2 Q) I2 T6 h$ z) W u7 ? ' O7 u( x. ?/ V+ s: ~/ p5 B- J
0 K8 {: N; n+ y
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
6 T6 U( l3 U8 X% j, y: y2 ~1 J. V, T5 \: f% C: m3 O, c6 ^+ q
) p; F! G5 Y* I$ ^1 T$ K H" s
1 F7 [4 x! B% p' p/ P- Z9 N
首先执行如下sql语句:1 l5 @7 B2 F- j
8 M1 r& o( X: C% H3 ~- Z% C
1 r1 e- N5 Z7 c7 r3 I+ Q x
! `1 q: u7 M; ?8 Emysql> select (ascii((substr(user(),1,1))) >> 7)=0;
$ G2 u* R9 a' f/ C/ X: ?* z |) e" I' E. W
/ l# v9 e, q, y3 \. ?7 K2 ~. i5 i- A" x& B7 k! l
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的/ c z9 Q& c- |* p. v! D
: j. T# A! `( P3 t) N - H$ Q! B j' L, f. x
, D- J, m$ f0 J5 p$ X
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1, ]0 R; T0 i0 o: `% E: [5 E) n4 r
5 c! X' [3 ^5 T5 z# O* t) T! L 0 T) m; {0 p P* u! k v
, B( s/ {6 f% j2 |6 @0 e如果运算结果为1,说明第一位为0,不为1
4 F5 y" e/ {# A( Q
& r( K8 W6 v' I 9 q8 p' A: s4 @) F
b& q' n, P" K& d* ^" V
+————————————–+: \: W; ]- F* z1 ?9 h. W/ R
) n( B0 |" n2 B% o. _5 [
| (ascii((substr(user(),1,1))) >> 7)=0 |& T. z4 s; K' a/ n! ~6 R& \# a
/ r7 @- N* J/ j6 C+————————————–+
; t1 l' z& Q. o% @* w" K; |' P1 f$ c+ @. k" h* J' j# G2 c
| 1 |
" V: {! t/ C" |$ Y% Y! G% j2 Y, I y2 h, P5 F. \
+————————————–+
- T/ N& L- O0 g' { j0 m2 C9 W! a& }, _% P2 g! p
1 row in set (0.00 sec); A7 ~1 T/ N& l7 p) ~ K. m: |5 o
% g( i- d" H: v4 w
这样我们就确定这个8bit的ascii的第一位为0" C) H1 H% @: l, n I: c7 } r
+ B5 h g5 j* s+ ^3 L! W2 X
" C: Z0 [, j3 O4 x! b2 C1 d2 ], {2 \; r# {/ c3 u
第二次我们来做6次右偏移来确定前两位) X4 }- j9 J2 I! O5 v+ z8 i& [
6 i: G/ j; _7 P' d
1 F2 C- l w9 R8 m$ E0 Z' v5 B
$ Z# c' m6 M) ]# X5 P6 M前两位可能是01或00,即依然可以与0做比较,
& {2 R6 y, X1 R6 N- C
* F+ g$ t* ]! [) Nmysql> select (ascii((substr(user(),1,1))) >> 6)=0;% m' y# P L& r9 z! g; T6 L3 t, @
9 k6 o* K8 Q0 ?( u. T& b+————————————–+& b; g1 s! _; O8 S2 O5 ^; t7 |( O
9 t g5 g3 x/ y6 X. H( l' I
| (ascii((substr(user(),1,1))) >> 6)=0 |) x" c$ F4 Q9 f9 @
+ d) V; n( b+ e
+————————————–+" B4 o' ]5 S- s6 d$ U. B/ ^+ l, e
2 {) z7 }: W/ { `. T4 ^9 g
| 0 |2 W- _0 ]! i7 ^# m$ Y! t J4 A5 \
- D, T9 S) |3 ]6 o/ D' w
+————————————–+
6 w t( _( S5 _$ H& K, j& a8 y
) }4 | X; z2 G1 row in set (0.00 sec). P. p% n& D+ v% J0 X
& X' |1 {4 }& }7 R3 x8 ^# i
1 P$ C. w3 P; Z: v, h
3 Z5 `3 ^+ W$ x2 |, O结果为0,即第二位为18 w7 J5 H+ T }7 b, _, x
2 e ~3 ^, K" Y4 l# _
; X' J* U& Y- D% w4 K- L; L
6 M C7 O( l v* r/ H& f' N+ H开始猜测前三位为010或011* r4 ~4 j4 ~+ M3 c5 M
+ V8 k2 `, H! M. N, h
; H3 G" C, H/ K/ l
! o) I; v- z5 [' _0 d7 D- Z( W9 G: v让我们看看010和011的ascii码是多少, G/ p9 }$ Q7 \9 r2 f. b/ d$ s
Z) f5 q* C7 G: }+ d! }5 i) `
3 F" X" g9 n' k! v/ b
6 H# ~- f. d( ^; s0 y, \% C0 p分别查询select b’011′ select b’010′4 I3 G7 i4 v4 o; q0 F
+ k: l( R1 p, y1 w% {0 a$ F : N3 m2 M# i' b, V1 \" Z3 t
( ^ c3 w, ?- g! b+ Z- J- \获得结果 010 = 2 011 = 3/ m/ R7 b5 T3 p* s2 c9 B
! H' u& E! q3 x" j- J: l , q4 j H+ n( C$ P& J3 B
8 @ b& x6 Q" `# k9 |2 g5 x, e
执行如下sql:
9 m: u* V1 r" P* y0 n# W; \# M3 p4 Z" ~. b" m0 g( S: z
' E) ~6 R5 K S+ K W: t7 S
/ [# F5 r' Q1 r4 J* H; imysql> select (ascii((substr(user(),1,1))) >> 5)=2;' z5 k6 ^6 I1 p6 ~9 a) J1 @
/ z. H2 y/ \. e+————————————–+- s' W: _) \5 ?% F6 f7 |* ? j" s5 g
! q4 G6 m% z0 G" H| (ascii((substr(user(),1,1))) >> 5)=2 |. m% h" C9 U, @1 B3 i' R; n' z8 p
" {* }/ ?& e, z2 E; i% I
+————————————–+! c2 Q+ q1 }/ i4 ~ }3 i) X# M+ n
9 I1 y+ b' r! V! W6 f# Z0 `
| 0 |
- I/ R" N. S3 L/ q+ v# U4 [+ \7 J5 |2 N
+————————————–+
8 r) X" t7 m/ ^
# a2 [) ^/ F7 Q0 P' s# h3 x7 }即前三位不为010,而是011
' q: G/ [6 p D1 s D
+ h+ p; H. {& z. w
5 ~2 o, j; Y- k3 c6 B/ ]$ F
1 I5 q& S# a( P7 [4 n( _5 D3 j0 h' p直到获得最后一位; C$ ]; T, r! q8 }- B4 m
; |5 r6 Z5 b, {1 L+ F) O
: X9 d3 i! _4 P
( Y9 _8 \0 f( \& o2 L' z最终结果为:01110010
# ?- Y. E# t* @- K) I; g! e; n; h! |3 n: H) F
7 l" v; c& f/ D+ Q2 ~* k/ q4 o7 S
" T& y" o( \- L y' T5 |. A转换一下:* W6 w5 y5 D- A6 X8 u$ ?2 t
; r# H0 a1 y* \- M/ h7 E
. k1 x [' E* e& \, S* `' Z# ^0 {' a: s
select b’01110010′5 J, l+ S. Z) C. `, A$ Z! j
0 Y( ]0 G+ b2 f
, z j: |) `) Z, W# X
& W! w6 y% V/ `2 e1 d
查询结果) }( b! P/ d: j+ A0 Z
' S) f" d+ \5 W4 N$ ]7 ?( Z; b
( F2 P7 A, m2 I: a; v: b5 f
3 v6 ]% A( t* @6 ]/ h* y+ c+————-+0 r+ p1 d% F- t' \4 K4 M
0 K- n# M! q7 Y! ~9 U" Z! M| b’01110010′ |
1 _# o9 X) r2 E) i) J% ^5 Z* g/ p; c/ o* D
+————-+
: R0 R0 H3 ~ U' Z9 M3 f" |. P
) C1 ?: c! n; F| r |
0 S1 Y% t4 d$ U+ k, a4 j. J+ g) G* c9 } V z% H5 V `
+————-+
8 I; P" }# d8 X s i+ \/ K. x/ w- }
1 row in set (0.00 sec)
& N, Z7 H' _( x3 N/ }) {- }# @# g1 a
$ e+ ^, K* w! { ^. \
2 [1 p( q- {8 c- v' x: }这样我们就获得了user()的第一位.其它位依此类推. k( `- H* ~/ ?9 @( i
U' o) C' I8 ?! t* g0 K' P9 b |