通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位- E ~& c4 O; i, V l& Q
, r8 _% y" Q1 s p
9 m! h, }9 E& Q2 v. H3 D
5 D% }2 c5 G, g1 i2 l) t. D下面将以查询mysql数据库当中user()的第一位为例:0 x; G: ^0 r$ g/ Y. y0 h! W
9 T( Y8 y( G. O( I {) N! f3 Q/ w
6 K* {* a) U+ J- \
U- `6 p8 C# A" t
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1), r1 P% a& M( j% X7 }2 K
7 ?: g0 |. _/ E, q7 j& T8 p
# i& L! ]6 y* L2 r8 C8 E! j- V5 s7 r I$ H
首先执行如下sql语句:
8 }$ S8 n9 b( y( S/ O" ^% l& f- s3 O% \4 L: z
' T1 K, o) g/ S" u. B' U- P
! B' j1 K* q8 D" Q, q# t4 K! ^
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;" V# b3 P- w6 Q/ z0 g- V
; ? W$ `) x; y( V" W) \
' T) ^% y7 j, g4 L# _* t
2 H g% ?! U' d, c& p我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
' R6 j6 \6 T" `. w+ i* ~; N- f8 _" ~% Q& S" x/ m: {9 w4 y
W4 H( h2 U8 D& a0 R
7 u5 |* L: X! H6 f+ n" x3 J. I+ C! P
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1+ P3 B- f% W: E. [6 T% ~5 @
9 M3 j: `) U2 Z& I) B, ?7 d( C
6 q: C. w/ C+ o( X& }+ u! n% I/ p, M, P
如果运算结果为1,说明第一位为0,不为1' {- T) D. g9 d/ x* P& X* |: p
0 k8 V$ L1 i! y8 G# ]" `" n$ n 3 N2 d2 H) j" |+ z0 @+ c
% H& ^& y! P" N7 R4 F+————————————–+. y) H( a: t" M8 N# g
1 ]0 |, N; J$ m' x- G' k| (ascii((substr(user(),1,1))) >> 7)=0 |
' P# {: P8 u$ J P
' a+ h$ _) C# [6 [3 J+————————————–+5 T( b2 v! U- _' v, h- F' l
" x1 _3 A& I% K: g/ Z| 1 |' p7 c/ b& i( J
2 L$ s) B& _; ?0 e! n; A+————————————–+* p& ?/ N: x6 J% y3 L3 b. A& t
$ e; A. C4 B/ Y1 row in set (0.00 sec)( c7 x! c: ?0 M0 K
2 w8 r' |8 t7 {' x) j1 `
这样我们就确定这个8bit的ascii的第一位为02 L& u9 {: V0 X) s- N
( H- S9 q: o, ^2 u( R* }8 V
2 U3 f0 t4 j- d: j& u5 p5 w+ g( [2 g
. Y9 s# P! I, u. f第二次我们来做6次右偏移来确定前两位+ B8 l, z$ `1 j, p: P7 @
) H* M, o; U% P$ k, g' @$ a
0 l% n) m# o$ `. [! \
4 W- Z! M" r; L( B前两位可能是01或00,即依然可以与0做比较,# [/ B/ S, E. V: }" y; G% p: L
0 g# C* D$ k4 L& S7 J) [9 Gmysql> select (ascii((substr(user(),1,1))) >> 6)=0;; q! e6 E! R% e2 A0 y6 v
' t: s G( B$ X- S4 u3 E+————————————–+
/ x% n- S1 A9 q5 z" t" n& m! G8 h" Y a8 b- D6 Q
| (ascii((substr(user(),1,1))) >> 6)=0 |% {& U' N6 S& x; B6 t0 ]5 Z% h
& j* D# b7 \ J7 \; t+————————————–+' n( I# V( @& K9 z+ N
: @5 G6 g0 u' ]2 Q* r1 `- B4 ?| 0 |+ u7 d6 {. L4 Y% }/ c9 j
3 f+ F) g0 ~% Q8 y2 I% W" K
+————————————–+
! S W$ B; r! r' s; C$ j( v) Y1 T n! g2 n, Y L! s
1 row in set (0.00 sec)* U" j: b; Q) |0 y$ i! ]; U
) J2 C2 r- o( G {) w % t9 z4 }- S7 c3 c) j0 D
& E2 \. r. W0 p
结果为0,即第二位为1
9 I9 X# z: M8 s, m3 ^8 g) N# I4 P/ E; v
6 G( }, ~) o t, {
9 ~$ l; t$ w- S3 ~( i开始猜测前三位为010或011
1 c: B# b0 l/ B% f* o+ K+ E1 E- R# n# I
2 ] T2 Q. h: E8 W+ x7 U; E: J2 p( g+ ]! v
让我们看看010和011的ascii码是多少! L7 t) I1 B. p6 @3 a
6 ~/ c' s& w0 k: m9 B$ M
" j# S- K$ `# A8 T8 d2 E- r2 K/ J0 c
- N8 Z7 h3 a: }0 s# N
分别查询select b’011′ select b’010′! ^" I9 E |, v9 g8 T* R! M
8 G) d }9 s' Z) J$ T3 i
3 r. ]8 \: Y3 G" a. m+ ^
: m9 s0 F4 v% X, o% k; R0 U4 z: d获得结果 010 = 2 011 = 3
( k! H, K, n" n* i9 o: @- Y0 P, k( _+ J$ S: S
/ g( j8 i: W8 ]7 l/ R. M% W
. `1 W, _5 d4 O/ y3 q' X6 M* P% I执行如下sql:, i. P- |" M- E+ ]! p5 ~- P b
y3 S2 @+ p2 R3 W6 ~) W
_. L b; e6 X5 C7 X# y
+ J& f% E" I5 l1 Wmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
8 K- L) X# K, N
y5 f' _% G% x, F, x( b z+————————————–+5 q' F; `$ ?3 |
2 [! n6 c! z( I0 M
| (ascii((substr(user(),1,1))) >> 5)=2 |
" D$ @" m. k7 {# N5 E- k, r5 @' g# q; W* ~# ~/ W/ l- U5 s e9 m1 o
+————————————–+
6 r1 Q2 {9 B, @* e
: x0 c! g/ C" z6 W| 0 |
9 f0 n* Q& _9 F& X9 d) h Z& T+ }3 ~' h: r) a2 q( c9 H# a6 m
+————————————–+0 b7 V q! B/ {- O" @6 U$ P
1 |8 D1 q+ ^6 ]7 d
即前三位不为010,而是011
7 u; i5 C0 U" a& H6 K' w/ y6 X. Q7 ~) N/ v7 e
& l Y0 O+ W7 G
7 J7 [4 B6 @5 s. m3 e$ s直到获得最后一位! z8 x! R. W/ k, u7 C
5 Y" X; }" s6 y ) k: p" X+ N0 N7 e% ?
" }: Q6 p4 u1 r. `2 z1 H9 m7 E7 i" x
最终结果为:01110010$ i ?0 G4 @# I1 R$ \
) E0 e6 X. e8 v* U( F" m" W7 G
- B8 y# t+ r; _" `3 h- q3 b
/ k, v; N1 a) a1 G转换一下:
; ]' x; C( q4 t( F8 J# W Q( D& W
" W' y& {% P# Y, B% O! D
! ~/ ^! y$ `( I: s$ |7 z) N% o
0 G7 I8 v! d) E# s5 j: `; r4 S1 `8 a4 Oselect b’01110010′
% G: D' X8 _- F2 x7 G, k$ d9 X3 V4 k5 r; P. x# ^4 {
) t! E% S6 c2 d) W
+ H1 ?4 N( m% p2 D# C0 ~- |
查询结果
, O7 v6 P. t8 F5 g# _
S4 ~% K: ^ Y7 _3 Q) ~ ; N! \& G+ Q* G1 ^8 {' i* L; O
! n1 I. c& |% }: o9 X3 G6 }
+————-+
" S2 v2 Z. Y" c$ ]- \% \( a+ O( L$ S7 F( ?/ G, _3 ?
| b’01110010′ |
& F. S9 A- @2 g/ N" k) I9 J' H& W
9 D }) h/ Z$ b8 R% W! A+————-+' R7 \, c. `# Y2 J
" O/ e3 l! E9 P4 L, F# t% F
| r |
2 r0 q9 L$ e; k t9 H4 T
3 m) Q- |& d# P, ]$ {+————-++ t' ~/ i; b; ^" \
: \6 W7 u- l+ J( N% t
1 row in set (0.00 sec)
2 c* |/ q- X- O1 R- F! e% Z& a
$ D0 h+ s2 h+ B% f5 f2 f7 Y
' \' T9 _# A4 z
4 i: m' l" [1 a6 O4 S这样我们就获得了user()的第一位.其它位依此类推
# Z& x* w d( E! z, U9 S: a9 c0 U$ ?/ \8 }5 M k! e
|