通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
5 w( [$ |- s5 Q5 B' o
8 r5 z( q/ T9 I. T: i/ m8 z( z( S ! y/ l! l0 T- n0 c$ W; U! |! Y
$ q7 N0 J2 i- d, F下面将以查询mysql数据库当中user()的第一位为例:+ N- C! M" t5 ]4 U
- J+ I& b* A5 e8 |' d
1 M5 T9 V+ E0 J9 V
4 _+ u. ?+ h: Bps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1); Q/ U: W8 z4 H& C; j) \
& s7 ?1 c. K( O+ b: A
: t: ?* r" H }" c
3 ?3 M3 d3 {* g$ D( H$ ]首先执行如下sql语句:5 v. D6 v+ m& w4 f, Y& l( ~
% j& d& m6 Q1 l: l: W4 n: y
/ y8 y/ ?5 J8 C* O* {( R1 z" f+ ~+ [2 X3 z9 |4 N- O. K6 r
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;2 m* \! d# Y8 R& \- g) D2 a
$ O* y S4 p) O
+ M6 Z% a2 h ?, T
" W: Z8 u# Z6 A7 e我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
]0 I: S+ f" \7 v: L
" \1 I* r, |) B P; x+ P 6 A) _; f5 l, `5 V3 }
1 o' o N* a8 m3 s* z( _6 _第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1# z, e+ @/ t6 X; c
! I0 l9 L, O7 B! v; \0 N * c, M8 j6 h8 T2 ~! n# i% z/ K) d
5 b" ?3 R' b3 y' i+ y9 A
如果运算结果为1,说明第一位为0,不为1
% \: v3 y# Y7 g- A, E, L$ J6 ]9 x) q2 [5 _) B
4 ` P/ U$ s% u+ e
* J! m: m- A; F$ A" L; ?! ?/ _
+————————————–+- q4 [( b) `% d5 y* h T' x
8 @" U( v$ w! O| (ascii((substr(user(),1,1))) >> 7)=0 |+ K- [5 B* n; r O6 W
2 i' T+ W J' m( Q6 \
+————————————–+! }! a3 {) r+ @$ P8 a
! i+ G k8 q$ _| 1 |
9 f) {1 g# v" X" s# @
! \8 J: |: _$ J$ T1 z: _+————————————–+- l N, G. R/ X( o- q6 o& U% O
$ z8 X5 a: l' K# Z$ W+ c
1 row in set (0.00 sec)
' c* P" v$ d4 S8 g: _2 |9 X
/ S$ s* z; S5 ~( E, o0 K' u# f这样我们就确定这个8bit的ascii的第一位为0
/ r, L1 |- d i
' K4 S) T2 i6 D v/ t8 N* l
: U3 T7 q# n- d
4 v; N. G. J, M8 R/ w) C第二次我们来做6次右偏移来确定前两位! _% y' r% a! W) @( V5 }9 Y o
! ]' o5 G6 {& q6 ^7 Z' o$ s
- G0 U3 L$ O8 N z$ X
) p7 a5 d2 o z1 H, q前两位可能是01或00,即依然可以与0做比较,0 g) |! h, n9 K7 P1 p; M( u: I
0 W a4 R- k. X* K1 @1 Smysql> select (ascii((substr(user(),1,1))) >> 6)=0;3 i( r" s! _% p" X2 \: l$ ^% C
. D# Q9 r/ `- d
+————————————–+
3 Y4 ~, n7 `8 i2 S7 S6 D( c. j, e, j. l0 D8 r
| (ascii((substr(user(),1,1))) >> 6)=0 |
7 y+ ?( d9 O5 Y( V% D( r2 A- Y' {3 A: H6 W
+————————————–+
* ~9 J1 R2 J9 _5 z5 O) l/ K; B: I% m7 v8 ?: P( v% o& i
| 0 |
0 Q/ \9 p' P* N1 e5 P+ J! ~
8 O* p. _9 l6 a# g+————————————–+
! n, C* H0 C& Q7 G9 V7 i8 n0 A# M1 C4 I# o2 {4 m8 U& O, C
1 row in set (0.00 sec)
4 p) c( H# H0 W: c) l
% I; {- f+ i7 t' X7 t7 | + `" m% m& v R9 N
4 ] M1 A p. N5 |+ R8 d R* W
结果为0,即第二位为1% T# ^; d6 N/ o) C! l4 R
* }5 ]& K3 i# k
+ F& q. q+ {% I; `' m7 X4 q+ Z7 W. N* ~( {
开始猜测前三位为010或011. J% A) d. ~: v* m1 o
/ m, H& D! y5 q$ ^
0 v6 |( f) `6 n( V1 a( h4 t; S
, N. f& k4 m5 r% V7 Y2 ]! j+ v让我们看看010和011的ascii码是多少
X' V3 i8 |: C; q" R$ r! y/ y4 q
' I1 A: K. |0 V6 n; A % i! p' W1 T& s, P7 g( f. Y3 V
! u) u* i. J9 v1 y1 ^1 b) F, X分别查询select b’011′ select b’010′
& s5 M5 w( V. V3 r* K/ g {, o' ?. u/ k
; I" u& B$ H' a8 k1 t - l U- b9 |) P5 F
3 B+ i) r9 q6 x, Z/ Y获得结果 010 = 2 011 = 3
) b5 S# m- g7 c: y
/ @5 W7 |9 D# L6 k8 r " c ?7 R4 M. l t
* z9 B% M1 `# c" Q; G
执行如下sql:8 ?. g! m I- Y; c" C/ P' V1 N7 a
1 n: k! Q6 r* J0 }: y; n
8 ?9 k7 P5 C% F( g# b* S$ Y2 F+ J3 ^4 f
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
$ i- K( d$ z* n1 d4 p/ s5 t( P0 y9 T( B* H$ m
+————————————–+$ ], B; B7 K- e8 P9 R
/ M# l. k5 i8 @% h" r1 P$ b s: W| (ascii((substr(user(),1,1))) >> 5)=2 |
& D, H1 Z8 u0 d1 C6 f! b1 X c
9 k# M$ F1 O$ s* p9 F+————————————–+
0 I" t3 e! {+ @- q8 \9 W G5 i& e. ^/ |1 A) R. b
| 0 |
J$ q2 h3 I: [ P' q m5 }9 u2 T
+————————————–+
( q+ ^ B1 n6 ^( R
3 \7 o* @# E- R% P5 j即前三位不为010,而是011/ d! }& T/ U. F6 g8 k
7 j L7 \3 x( ~9 ], [
7 N# O; G. l- X6 R0 f0 A
( _( Y0 v! w( L2 q5 G3 r直到获得最后一位
+ X5 G. p; Y: R0 B& p: \& j! ]$ x6 a" j5 V: g
' a& F: \' ~& t( O
, Q, Q* O8 D. T `, V! L( M最终结果为:01110010
8 v/ I; ~. y6 E3 Y& t5 K* f& b! p
0 x/ G* {* p: H" }% t( z( i! [, s
/ L& r8 L4 v' I3 R( d) `9 D2 [8 v3 J# O3 ]9 ?1 \
转换一下:
( W4 H% V3 k D! e$ F- R/ T' T# n4 P, Q9 v+ b
% _% y( g! S' ?5 O* w
' m5 E! e+ i1 S) [select b’01110010′
! }9 h# E) H2 y2 E! Y# `8 ^( z! M) z7 B6 p- u0 E' `( _+ m- o6 o
, R! y- F6 i+ I6 K
/ w- M' k4 W& i+ [/ f6 x/ D# e0 r
查询结果' ^( k8 o) n# b5 g
+ D2 |$ @! U) Z! T- g% D; d g$ s
4 b+ w: \( q, D8 a
q3 {, ^7 L- T' h5 Z6 M
+————-+
+ z& ?6 @- K C# f/ i. t/ k
' h% l/ X$ W5 k, ?/ _| b’01110010′ |& I- d# F5 B0 N2 V# }
/ w8 w6 ?* k4 {- P( M5 X+————-+) q3 Z" v/ l! y
3 p; `) O, i' w$ X2 S! ^, t
| r |
/ q5 }$ O0 |' e% A+ H; Q1 g. `4 ^9 s% h6 ^1 o: l
+————-+% l; c7 J E k- i0 c
9 F0 H6 ~6 A/ b/ |; M" }1 row in set (0.00 sec)
% ^# i/ t8 v6 q* S, G2 a$ q
! B( ^- R% h+ J5 Y: V
$ c4 H, p- h" c2 X
/ A9 T& \& D; Y* f3 C! `$ t3 [# \这样我们就获得了user()的第一位.其它位依此类推
# V3 A! J# l) ? }
; v. n) a) m6 M& x |