通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
9 {7 H! `2 M7 E% N; v4 e# P9 H8 s
- j/ G! c4 `7 P1 O & P" R# }2 ?7 `; i6 J7 f
, r) C k9 n" F- N# y) x( l下面将以查询mysql数据库当中user()的第一位为例:$ F! M5 y- K+ f) s- R4 D. C
1 X; b' f& w R' O2 }' u
0 y! D, o6 S' w! x. D& X; ^* L8 g* T
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1), `* |+ C, T$ o" @# f9 c
% ]+ A% s+ ~5 U. s ! J3 N" k/ H! k: d" y
" |8 u! {2 F5 L# n
首先执行如下sql语句:
1 a$ {/ D- U5 C: l/ P t0 R
, N) D# k3 a4 f
1 W* k7 s1 y e/ b& T3 R* _* E' ]+ P/ d0 Z+ p9 C) S0 |- G/ j
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;1 @5 R* H# l8 D1 [4 X. U; t
8 ~/ B) m; ]2 ?% i" S
6 B. T2 p- b' z, a
2 F( ^1 T) ^- e9 p4 L9 C$ V9 q我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的 z: X1 n+ E2 n. ^( {% _+ D) `
' I! K' Z5 Y. \3 N3 _5 H
, h! L" p0 z& d5 ]4 K% g- {
$ `# p, x# \2 L& d6 p( a4 e第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
! {8 L9 N& n; y
8 T' B! k2 w `0 g5 [& r . W0 a; d! \" u& R
/ v( g0 ? n0 s7 _. u7 `
如果运算结果为1,说明第一位为0,不为1
) E5 w; P2 Y# W# d& ^6 L
+ d r7 S2 `5 t! G- [: b I
; H' e4 `/ ~5 ~0 v }+ }7 X" j& U2 _( T# C/ `6 B, [5 m$ N9 V
+————————————–+) v. Z! Z) n, O% r& V3 `
; m$ X# I% J* Z- D
| (ascii((substr(user(),1,1))) >> 7)=0 |- N" b* o5 u9 x
& f: M7 E) r1 t2 Y% N, E7 w E+————————————–+
: ]' J7 [/ i: N, v
; M) T# W( }0 Y| 1 |
; n- A) p% J# d# _& `: u# g/ Z
9 A U/ S' {- ~' R+————————————–+
) R5 d. k9 T+ c1 y) L3 j$ s \+ P1 g) j* l% N/ S( R+ J& Z" ?
1 row in set (0.00 sec)
$ y; z: y- T a3 b8 I& y, a: o! X3 X
这样我们就确定这个8bit的ascii的第一位为0: t9 V% q( R) p
' L0 S2 {9 L! |* Z; {
. J/ _ ?" L/ ~+ S8 B2 G
9 o' g) f3 w% k8 ]( H' d0 I第二次我们来做6次右偏移来确定前两位 ~3 v( U+ _, u! @5 B3 `
7 C2 D- [ m2 L& }# C9 Y: V. ~% Z
& S' s- b, J9 T; R, `: K6 q7 X ]7 G) H9 i2 e" P' S; y
前两位可能是01或00,即依然可以与0做比较,5 X0 p6 {$ ~( N' v
- k; Z0 K, N/ h. y8 U3 K2 Y" n! zmysql> select (ascii((substr(user(),1,1))) >> 6)=0;+ Q& k0 U B1 X2 u5 o; n9 j3 c4 q# g
& H2 l8 R# o4 ?- L
+————————————–+
- U b2 P# X- z# ]' P* |3 I1 F% O" L# }8 U4 H: `, n9 s
| (ascii((substr(user(),1,1))) >> 6)=0 |
, I# T7 H5 B) D" h O B @
0 m& D% G0 j# p+————————————–+
# Q1 i) Z- i$ Y
' W0 ~9 t; s8 k1 ~| 0 |) E& v1 ?* {, ~
% Z5 k- W* ?: ^& M/ v
+————————————–+. I2 @) q8 q. W
2 z2 n7 O# Y- j* e4 z
1 row in set (0.00 sec)
* y- O2 j) R( k- m5 n1 o" \9 n& @% v
7 r0 n2 z$ G( D' |7 u& }' [1 o
结果为0,即第二位为1
5 t# r, _& V- P, ]. f& e4 R' _+ t- v: k; j+ e4 i, S9 b3 V/ ^3 k
/ `. ] w( z! E' x# X
3 }% d) C/ K4 r
开始猜测前三位为010或011
6 E2 O2 [$ i: f: C+ I
( n8 q2 r0 \ L1 E. }* |
6 a8 n5 I- Y, Y& B0 W; f
' R& }5 |7 M! n5 \让我们看看010和011的ascii码是多少+ x4 ^0 i: s, r* H. _3 O/ Z
7 V4 d- h1 G$ G
$ Q$ ~; L7 n; k1 N3 {4 r: q
5 z4 @& ^' L% r+ r* ?* F分别查询select b’011′ select b’010′; u. g! C" b0 T1 s& J
9 X# N$ y; h, X! z4 Y- F & M) F+ n9 q- d
! W3 F) E8 b% K8 z9 l* V获得结果 010 = 2 011 = 3; F! F. y* n. J: `/ a
7 h7 M! K2 y4 D! G8 g: H. O
, p: c' u5 Z* N# {+ g2 ~
% `+ h+ }, ?! G1 T- s执行如下sql:* N7 u0 {+ e: V% G
! ^8 O1 t! |7 w6 L1 h0 D& h
7 y) L% F2 K# e' _5 ^ K7 o6 T7 r& Y% _2 k+ c8 }
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;# P# z- W% [# U; j
, ]" W; v. y. v1 R9 @4 U6 N
+————————————–+
/ ^4 Z( G" Z! [7 a! p- Q4 H& z. ^2 C* U* P
| (ascii((substr(user(),1,1))) >> 5)=2 |
% J1 ~5 n! C( T1 e+ x* [, u+ |* `! b$ L) ^
+————————————–+; ]9 ^( L) ]# i
) z6 t) s' @, W8 {' I. a& ?
| 0 |
' q- _5 h# {8 o6 R( e- C& m e9 \; Y2 ?) X9 o6 E, [( z3 [
+————————————–+9 s9 w; k7 ^3 p, i3 W
" B7 t. B" k9 @ F
即前三位不为010,而是011
. @- z& _ O: x) s. g9 b' d8 _5 t) O4 T6 N0 _
7 h6 H2 t/ o* s [5 `+ ^
+ v0 X, n% Z9 G. j直到获得最后一位; H3 U# N' [2 h0 H6 Z, N
- [* z/ }7 o1 c( j& n& L7 }7 U$ U + a2 h' E- R6 w. _2 m- N2 }; C
4 K; E% y0 ^7 s& E最终结果为:01110010
+ M/ k! m; L6 r- ` V; R" m: R( {4 a" W; q: ^/ ?# y8 w9 V8 M
( g3 n% v* F( b# U
( _; Q9 g: w! U转换一下:
E4 q# H. Y$ h; S8 g( Y+ f: U) C: Q) F: K
% |6 ?+ j2 g. }7 z
2 x$ y: t2 u7 `4 j+ Eselect b’01110010′- @. D+ ]* g y, R) H- b9 K
! }4 u' w, P; x2 A
3 y [0 A/ b) X$ C" Y0 U- j/ P' [
' T9 z3 B/ a! o& f R. Y# ]' n查询结果
4 l) Q, E, U/ r
7 V# z. {( A' l' a: L$ n4 d. j
5 l6 \0 d3 f2 L$ [ V$ {
$ @+ A1 @5 P: ~$ b, K, |+————-++ G: n8 N9 |" T: Z) Q! T2 R
[% O# a* K* [2 O" t
| b’01110010′ |) y1 _5 x% \2 I W) |2 @
& e# K( t' e5 _- y8 K2 d! O+————-+
, ~4 R+ Z c0 F/ u3 ?! \5 f9 d$ ^* Z6 I" J
| r |
& m- l- H2 T e( M. |9 Q0 ^9 m% h
+————-+
. ^5 w3 r# c9 |& }! |1 e, k5 I. Y7 Y: v% E" q6 Z! L
1 row in set (0.00 sec)8 h0 [8 P1 l3 w
- V) R- N6 r2 t
. I/ c# w/ o% `2 I* b/ d4 G2 p0 i: N3 C- F/ E w4 _; I
这样我们就获得了user()的第一位.其它位依此类推
& ^6 W$ x/ a: ^! L) u9 b- @- W0 q( Q8 H: U, g3 F
|