通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
; m( {6 c& K6 J& i
9 b2 O( @$ J' |# t$ m ) m; Z( ]5 X0 I0 R; Z/ F
1 Z+ {. b) n5 ?6 R下面将以查询mysql数据库当中user()的第一位为例:
, m" B6 A2 m: Y0 ~
2 g7 z; O. a! a$ x 1 r; W# i: h/ Y1 X
" L# g$ l6 F. s4 L) \1 c
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1). Q. E6 Y7 P) \
1 ~! s: e" h4 W. N# y
, l* v2 i; x7 }' C
/ C7 {! D2 d; l( W. G1 Y# i首先执行如下sql语句:
+ u5 E0 V; ?! h( Q, @0 H8 b) Q! t) c. J$ G1 L# \) K
/ _+ l. K% F0 ~; i4 k) ~- ^
" g3 j0 v1 f4 q5 k" _6 [mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
, Q# m8 l' ^) y- J* c6 |( l/ K* w# M( k( j0 ]; q5 `
6 O3 o4 ?6 s- g# o# R7 Y$ Y7 @+ u* { {( ?8 H# G. [- s6 c- {
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
9 @( X, W7 S- b: {% I: c' v: g8 B) t7 o/ h0 ^; i0 P$ N- u8 l
' H& a$ T( h6 C8 ?: e5 J& `( w" N$ a/ `0 v# I" e
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
8 l' b' v8 X- L6 }7 `2 T2 e# w/ @0 \3 L
. I: ~0 x4 `* G; }* h! c
% b9 Z9 x5 L! _0 F6 _, U4 k5 _如果运算结果为1,说明第一位为0,不为1
: s/ r& v9 `3 z# |! C( p, N' z5 C/ h' V0 Z6 c: A T( e4 p6 B
; v# {% }" }+ r$ d: s0 C1 P* d
/ h7 p. O+ P+ M* f4 c+————————————–+$ y6 \. V; `* g- `' V5 w* p
* o, U5 s3 m1 d5 g7 ^| (ascii((substr(user(),1,1))) >> 7)=0 |
, m7 ]# d6 M' ?. @6 d
( p. C4 n0 n" t9 z" s) B. g/ t+————————————–+
+ X8 ?: X: z$ ]( n7 p: Q1 z. c
! [( X' g! g6 }0 n( k4 N' ~( N| 1 |: e$ t! `. R! ?
r) S" d. ?- w1 `% N* g) r+————————————–+ I$ H9 v* \9 \3 K5 j
z4 Z( |1 @/ Q+ _" p2 s
1 row in set (0.00 sec)" }& C/ X7 V6 @) H6 G5 V
6 m, F& Y* g+ i( h# K这样我们就确定这个8bit的ascii的第一位为0$ v) U* E, }- I6 N% y! ]
# L0 ?% x* S7 K D6 E" @1 x
! H- D: U& h: s1 A3 T( @
# c9 Z5 m: \9 j/ h6 k7 N第二次我们来做6次右偏移来确定前两位% \4 `0 A; l! o3 F7 T8 z
) M9 r" C# H& ^- o) m6 s
6 U0 k" @5 c; ]# }; i# c6 w" j( M3 i: N) u9 q" e
前两位可能是01或00,即依然可以与0做比较,
3 S% F) z9 \8 [3 S. \+ g4 |, V4 c4 j- y
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;$ i/ n0 A/ }- c0 I
7 ^% e. y; M9 o$ [3 r+ A+————————————–+
9 v) G3 u7 z% p$ J' n, E; @5 L- G8 ~- F! O8 z3 g
| (ascii((substr(user(),1,1))) >> 6)=0 |
7 z3 D, w* r7 i* T3 _) c0 o% X6 ^5 c4 {+ n. z# O& Z4 r3 Z5 E4 \
+————————————–+& G( g) _# u% F7 O4 J
4 J0 d9 r! v) h8 [: y+ ]$ a- j5 {( S| 0 |: Y2 Q2 }8 l4 a
" a' }2 }6 l: C4 p" ]+ p
+————————————–+! f7 z6 t1 f5 G
( y" `9 S ~2 L* i) H( |1 row in set (0.00 sec)' l0 Q, c8 t6 ~6 ^" U: R
( a5 w. k8 ]6 P7 ^2 v
4 `0 w5 q/ _$ }- b, ]% X& D& a5 Z5 h: a# @
结果为0,即第二位为1
1 }' D. ?4 W, b0 b. k/ ~0 Y! A7 s( \
/ X4 j4 x5 L6 `" F) j8 S' g) z2 p8 ?1 K. M/ c
开始猜测前三位为010或011# W, o+ j7 ?- S+ s% H" o1 J/ E. c
' X; B7 e3 [ Y, I9 C' J( H
# {& J' J6 a( w+ A, Z* z n8 c" `, ]: d1 q+ K0 Y
让我们看看010和011的ascii码是多少, u, y- c2 v2 U- Q$ A
! T9 y( a Q" A" I+ H* }+ z5 S- X : [ R6 ?3 M% F. ^; w
/ `2 }: D! t' }( n+ l+ t分别查询select b’011′ select b’010′, I: I. a, q5 \: L4 k+ ^. b3 ?, ?
P% m. [0 }& L3 @( ~* X# ]! p5 L
! d: `; y' b$ K6 V8 b
' [5 L! |$ \ q0 `9 \) ~获得结果 010 = 2 011 = 3
& H, ?$ P6 J$ z+ }; K1 g* J
' p) b) Y2 R& w( G
( K" ^+ ?/ t# W* W1 N5 j; w! R( L k* o: i" o7 y. I
执行如下sql:
9 D) v$ {( I& ~9 _# P+ D7 h0 N, N, O: ^
' O9 i8 _8 }3 k: {1 z$ P0 L5 W( I9 a3 u P+ B- X( X
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;- Q5 P: x7 u3 J) j3 i3 z
' _- C( `' f! c+ n+ P3 y3 l+————————————–+
5 S/ ~ h6 l6 }* F0 E# a1 d7 R, {
3 e$ Y! F1 ~6 w) F3 y3 E9 V| (ascii((substr(user(),1,1))) >> 5)=2 |- v7 Q! O2 }$ `& H
) s, W# P Y8 O' O/ f0 s" o1 r3 Z
+————————————–+
% J3 ]5 l. M# z: @ }" g7 _
: Y. ^ S. e7 {| 0 |
( z( N2 [6 ~2 k1 }' a6 ~5 v A$ {& C! o& V8 d3 _
+————————————–+% x5 C0 @# R, E( x# g v
4 W% ^) Y+ {, n7 Z, C
即前三位不为010,而是011
2 m3 F: V/ ^5 m$ S( W7 U$ u$ j0 V7 @* q8 G
w. \+ E8 F& B: M" s# u) F1 S" Q6 Z! ?: a* D
直到获得最后一位& g% o3 M% d2 d2 H5 I6 b% v# ?# r* _
4 [2 A" ?) v, T$ x7 x6 X
* ^7 y9 t; y8 @6 H1 `
9 V* P# T& x( p- o% ]* y最终结果为:011100105 ?" K( M8 Y9 L8 p3 m
4 @8 \ \; c+ Y" Z" V' r' X. b/ ] % b$ x* Q, c) L
* w! z; `$ T D0 d$ \转换一下:9 j, T$ u- P' q2 Q0 w! O/ J
( x: T' |8 ]; A' t1 Q1 L
m# g' l0 d3 a l
5 ^) C7 V4 P1 y7 Q" X& Z7 O0 oselect b’01110010′
# L) q3 f) f" a$ f% a$ K6 I) ?: M3 l& I! C8 i6 l
4 w. C d/ [8 I; U5 Z7 J: t, y; d. J( H
查询结果
* V' u/ [+ {8 m% W6 t. Z, C0 l8 w3 m4 G& V" J" S+ d
8 P( h) ` T) f, o) v: m0 k; u
3 L+ V1 ? O" R9 ^0 N2 S% c- S
+————-+: w0 }4 j. E* Z
+ A. v2 f* _" r, z+ p: R) C9 K r| b’01110010′ |0 |! r: _1 m8 n4 H
) E3 n: G) Z h; P- } _
+————-+8 |# B4 y! J) D; O! n ], d5 U
^+ i4 u% ]" R, V. K% X
| r |
) g/ @+ L$ D9 j/ j5 V4 C* k
$ {0 S! ?: P% U& _; t! C+————-+8 S/ y: f' B& L% C8 o6 J
/ `* {3 ~* J1 \
1 row in set (0.00 sec)
% }" h% i o; ^: f$ H" L3 u& M& D( X" t6 [& s6 N% k
: }1 H4 n0 L2 n# Q
1 P# A7 g/ I0 y0 Z' W; u8 l这样我们就获得了user()的第一位.其它位依此类推* a; S9 t$ f3 r2 g; ?
# R- s8 g+ N8 U4 B) Q
|