通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位. r# F. g* p- C
+ e, d9 n: g, M. o0 \; B
5 s1 Q. p5 v$ @' L/ m0 a+ a9 Z: G$ F$ r* u" o
下面将以查询mysql数据库当中user()的第一位为例:0 E1 E$ a) A+ B& e! `2 C4 M
, T I2 a& ], Q ~/ h4 J7 w ; b) [5 g; k& ~( n+ }' ~4 j% k
% _+ B1 p+ n$ i3 B% f9 yps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
1 t# V0 s4 S. K; a% B3 H
8 Z: k! s# _- g 4 Z' _7 u$ _6 V* \7 w! ]: k
, R1 [, e: j+ _# [- l" i7 ~
首先执行如下sql语句:
. s- r, ]* ?* \+ T% e$ i
4 D; y+ ?$ t4 o $ t% y$ o* W/ d; f$ p. M
- K9 u- o9 I' u E6 I" _- K% O) a3 O
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;9 F B$ f: `; j& a" [+ c- B$ t5 w
4 Q/ Q7 }- E4 Z* j. \' h
! m/ C+ r+ Y4 t( j& k. }- Y
% v9 J6 g) ?- Z0 q& @
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的6 G3 z# q0 d4 M
; w: S& h$ c1 d. K3 f+ }
- n( j! E) W. V4 A
# Q3 @) x4 q+ }2 o% w第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
' R1 m4 N- z; a1 h/ ]& C9 A0 q1 \0 C1 h( z
5 D& ]) s! l9 `( m3 c" a! n/ h( H# d9 y2 P
如果运算结果为1,说明第一位为0,不为1
/ e7 i7 T% N4 [$ w4 ~
0 L# H# m' u7 A6 y
& {7 [0 W& m3 j, I# W! e
* V/ ^4 e, X" q0 B5 i- h+————————————–+
$ Z' Y8 K& h3 x! g. U; q- B, h: _ v( n
| (ascii((substr(user(),1,1))) >> 7)=0 |
. q( B9 s- P6 k6 H, Y1 N4 R! d5 |
; A; S& I- r6 X" b& G0 c+————————————–+
# W) b( K' _$ p# [" }$ D' o
* F* r8 ~- t$ _$ z| 1 |
9 i F: C" {9 }. s5 C! [. U* m1 v7 {8 k/ z4 V: i2 b! O
+————————————–+
% K3 W& e* q2 s% W! i
6 k6 u- M: ]! c: o0 b1 row in set (0.00 sec)
" a; `$ {$ _. Y, e1 N, [" q4 K# z" V
这样我们就确定这个8bit的ascii的第一位为03 c: U8 P; ]' z1 ^3 u
, [7 z }- y9 K+ T% l; o( G ) f3 P" [$ m u& j
2 L( A ?; E- e: @' R. E0 Q
第二次我们来做6次右偏移来确定前两位
* u% b$ c3 Q' E7 @( k; [) ]/ |, x2 B8 i- K1 R# P9 B
, \0 K. z+ x7 |$ c0 F! h4 j
2 o; e" j' T) t8 J2 ~+ e$ r前两位可能是01或00,即依然可以与0做比较,5 {; H s' G" g; }# D
: {5 p% X" t8 [4 }2 o) F
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
0 {; j" R6 _9 r& a5 k, n: W% O: X! ?" i) O3 e
+————————————–+
$ h3 K; }/ t& {+ K6 ?
]( k$ J( ^( T) q1 e& n| (ascii((substr(user(),1,1))) >> 6)=0 |4 [% c6 Y2 y% M: X! h% c% d& U
( l$ |' v6 a% ]& R& E M
+————————————–+
$ c7 K% N& J- P# N4 X
5 p, U; k& _5 F* Q) I) @| 0 |+ t9 i6 a) j' e: |
* k, U: k3 U2 B# f# T9 K+————————————–+
2 t+ a1 V- C9 d+ }& P, T# G$ ^
. R- j: F/ j \( I, ^' m+ J! G1 row in set (0.00 sec)
; _! I1 o; z! }6 V5 z
- x$ V+ f7 ]. {' ?/ V. ]
) O" Y# o& t8 Z4 r
, H% W8 E; e0 f% p" F+ Y结果为0,即第二位为1" Z& X- Y) `/ B; |# g& V& r
9 o6 N$ [" I) x1 C. R5 H7 o
; S$ _! j o8 S. V5 v( |8 Q: _& `- I5 X: E8 F
开始猜测前三位为010或011
m: k+ e0 i0 O j
; ~2 T% \7 n1 S. O. A/ P" n" Q % f4 |& T1 K' [7 z3 o1 S
- s/ P8 m4 K0 m! i, F2 i ^2 `4 ]
让我们看看010和011的ascii码是多少- j( Y3 |$ J- O$ J& i8 [! Z" R0 R
& d3 ~- D4 b2 [: m5 B" s
2 p" v* a/ u# A! Z+ `& z" g% i" i5 B( l- A1 B
分别查询select b’011′ select b’010′& q$ I8 _7 `( Z" `8 J6 X3 _
- W4 G f' _, ^$ E8 o! T' H: F: ` ! T( T0 d% d; X. I5 F- ~
6 Q, r1 ?. U, H4 k获得结果 010 = 2 011 = 3
" `! L, W. F% m u
! h4 _# }- A: N2 n t7 m
! \* a! o# ^) n* v: H$ n/ c' D0 E3 h1 E x/ o# }" A* z
执行如下sql:) F/ m+ W: V1 ~3 j" v
* a e# R* t! f- z$ {, |! i$ O- Q8 `
h$ s @' A) d( B: r% l
. ^+ o# C9 q$ K2 L% d* [mysql> select (ascii((substr(user(),1,1))) >> 5)=2;7 B ^2 M) u. u
, G: i+ p5 C1 U* ?3 B+ V: W
+————————————–+3 m- `' b; \9 h4 k
, `3 B7 m; k3 ]" N| (ascii((substr(user(),1,1))) >> 5)=2 |
$ e# E- v4 h& S2 r$ F- E) E# a# L; l k, |) b! C
+————————————–+
8 a- T! o( N0 x/ E2 X
9 R) i# J( P% X$ T% {| 0 |
+ R6 A R/ @$ f6 J5 \" o/ [" o5 {
3 P8 G: t; n5 {. r+————————————–+
# ?2 a' ^" n: D, S1 T: T/ B. B% F4 ?' _) A) {+ k+ e9 L7 K' o2 m `
即前三位不为010,而是011
# J2 w( {) B4 p! j0 G0 @6 g' g {8 s, i: k4 p
$ c" f+ R) s5 ~4 z$ Z! C! B8 {. a' K! r9 L* ~. b9 b
直到获得最后一位& S! ]6 G/ X+ A2 u ]* Z
2 U$ x& M3 J: ~ : `6 i* T) I& ~6 k: d F7 g
! ]/ b' A: L4 [0 j$ O+ U. O最终结果为:011100104 ]3 u" l; e1 [1 h* `
) I' P/ H! [ z+ E0 H. X( V
3 P( w4 B. _ ] X
n2 H8 G ~% S转换一下:
B I) E. y! d9 j/ g, q7 B2 g! }
3 m: m/ S ~( Z8 ]# I* _( N/ ]4 V4 R" c+ }
select b’01110010′
+ {* C$ e2 ~ X
9 Z+ o j5 M) d( n$ c9 r
& ~& Q/ [( T8 J
$ `/ o) a9 k) ?/ X; @, r+ w3 L6 D查询结果
/ q8 u& M' D7 A, z9 c4 J7 @: I9 c7 I% f3 L+ z, {" ~$ |
+ A2 Z; N! ~; w1 u/ l1 b* q) c4 e# R% c, G( ? y
+————-+
* K: E |0 s5 i7 Y# ~
8 g( @; i+ C$ t2 a- `& ] h| b’01110010′ |
7 c K0 Q4 i4 ~( D2 T5 S; Y2 ^% y
6 p9 q2 e: S" a+————-+
6 Y& ]6 u- U' D6 X5 r7 Y
; X3 j4 \" n) U| r |5 x% W e6 I Q/ ~" I
; X9 l# @8 @6 ~, L+————-+
% r( O* e9 p/ N
* G7 ?( v; k2 B% b, _1 row in set (0.00 sec)
5 p8 c+ T/ _! a1 A
1 U2 @$ P2 t q }8 a. n2 E3 v + a. b& G% \- z- s4 k0 n
$ B' O# _9 b4 o这样我们就获得了user()的第一位.其它位依此类推4 U8 z, q8 S9 e+ e4 s( Z
5 z7 L5 c8 ~/ o ` |