通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位9 u& {/ Z' `- q
; R1 b5 w7 A# \1 q3 n
) j8 \+ v; E8 @& p- G7 r w+ m
$ D4 A w& b3 j, D: ?( H0 @
下面将以查询mysql数据库当中user()的第一位为例:/ o, p+ @1 V9 T
$ B0 y5 d( N0 B, ~! ^ 6 Q+ |- Y% y3 j- r: a7 h
) A) {, H. W- W( Nps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
4 K. V+ T: l |2 r$ r4 g; S! [% K5 a5 P1 y8 @. x ^3 \- N; U2 H; w4 \$ l: z
% L8 Y. f8 }) I7 e+ r
7 d! K ^, z! H. v
首先执行如下sql语句:
, n# C/ k6 l& I9 s5 Q% B. _6 ]- t# N9 w. q5 v. v
7 ~3 G' k$ t7 C `6 a& s. s8 l. f
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;' k3 \7 H% P/ [" N1 p; h
; E' @- ^9 i( D& @' u( _3 i- c
( ^$ V# ^9 g) a( W' e0 _. I1 A
7 R3 A' _! k# r x我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
4 k0 r1 P7 f! [
/ q; K$ K* m- `' |! a) x( n- j 1 f @ ~' q4 @) s- a
6 Z& v7 f/ o. i. g9 Z
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
: A1 q! b& c' z7 h: L4 R* d1 p/ v; d) k. k% e, r% V
; u% g0 O+ h0 k, E/ v% Q* Z1 |! L: [
}% s+ b$ ]6 X. t; T' ~3 v4 s( s如果运算结果为1,说明第一位为0,不为1
' B) d7 [4 b, ]* w+ o9 M0 f
: `: _4 a o. ^1 w/ P' E6 O 6 m7 W4 |: w, S6 C4 k& l
- V( m/ M% O4 A; w0 g a
+————————————–+# w( f" w; O6 I+ X4 I
4 W* N( q ~2 d5 D- B/ g
| (ascii((substr(user(),1,1))) >> 7)=0 |) }: [5 o2 ?$ v4 t/ l* h, q
, Z' N8 j$ }3 J9 c/ A2 X0 G
+————————————–+
( y. S; U, Z @5 `. w0 i' b7 q' Z& y( c @
| 1 |+ w y1 R0 _4 b) ^
! R$ i0 q; x" _. ?7 y7 d; j
+————————————–+8 g5 S0 g% B! I$ {/ i1 g! ]# L
. }3 D$ I* s% J& ]
1 row in set (0.00 sec)
5 x; m5 W- q l9 ]8 Q7 x+ b
" p1 P! o1 b. _2 L2 {" ~7 r这样我们就确定这个8bit的ascii的第一位为0
2 K3 k2 ?& _& o1 z3 _( c( f6 [
4 s `4 f5 L2 P% N7 \9 O, d
; G- V3 I2 U' W% O; X+ B. L7 [2 r0 Y
第二次我们来做6次右偏移来确定前两位- f/ r, d" M" f, N% m* `, s
/ }$ k: z0 u/ |$ `4 D, x& J * {) k2 P+ g, e# ]) {3 i
0 u% e2 q6 H7 m" Z, ]4 F前两位可能是01或00,即依然可以与0做比较,
* K- ?6 }: Y `1 D9 Q* S" i: d: e4 d, S, `+ i$ d
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
+ E- W# x6 J- F
f, ]8 u2 a1 t# L+————————————–+
$ b7 e; `' z4 P$ o5 l9 s1 W! b7 i1 \: ] J
| (ascii((substr(user(),1,1))) >> 6)=0 |
- U7 I1 ]0 |3 |& [& e( L$ C6 u1 X j) q4 t/ w) C
+————————————–+) W7 O+ ^, W$ I+ k6 l* M" _0 E- U4 T
3 Z0 B# B$ k+ t) C| 0 |4 p& C3 e8 z# k4 W9 Y+ |
, C* p! J& q1 M' S+————————————–+
: B' O' `2 D2 _# |/ Q, S0 x# f$ e: B! Z! s( T l
1 row in set (0.00 sec)
& ~7 q" {7 f* A
$ B2 |. a8 E& n' Y- c8 V
0 w V) T1 E" G# K, n4 t0 t: n# I. f* d, N9 l- l9 S5 S# e
结果为0,即第二位为1
) T* u t$ M$ F" [0 x$ O$ i
( w, t* m! l3 y, ?0 P' A2 H
6 k+ g& { q. @- G% J1 W/ [0 I; }1 ^/ }( E
开始猜测前三位为010或011' ]8 R: T4 p; I" q$ u7 J
/ i" O6 {$ b7 m , U9 B6 p, [, O, H. N2 L( M
6 @) a8 V4 ~7 {: n" s$ X
让我们看看010和011的ascii码是多少( w4 A5 l7 [/ r
2 R& G" \8 x) o2 a
3 ~& X, U+ v) |1 A8 V& F8 Y; q
8 `& Z( J4 o2 c分别查询select b’011′ select b’010′+ f, e. p$ o+ c
/ K# N3 k+ F, g2 Z% b
9 ]! b( f1 G: k0 {8 x6 ~. ^8 Y- L% f) M; ?2 D
获得结果 010 = 2 011 = 3, W. D& @5 ?) x* p
5 [6 Q D- P7 Y( Y5 d1 u2 u
; } ?0 w% i8 N+ W2 x3 V( [# X8 H" D+ A
执行如下sql:' \ [5 }9 J4 R S
6 G: V7 j7 w& Z) [; q' \: ]
1 C K1 t. w6 U5 j
4 v0 O& N2 h( a' ?& vmysql> select (ascii((substr(user(),1,1))) >> 5)=2;$ @: [+ s2 r! w8 H+ F9 x N5 M
) r" {, U, T" Z6 ~+————————————–+7 w, e8 f% c& q- o3 u
! G3 ~9 n/ J. m( ~7 g
| (ascii((substr(user(),1,1))) >> 5)=2 |! N' a" H6 M/ G; t( @5 X
6 N% R. y0 i0 V' m
+————————————–+& P' G A" ]0 D h7 ^
' r5 @* ~2 d- J$ ]0 _, ^| 0 |
w% I9 N- b, c: W6 R% T# j, @( B5 q* F
+————————————–+# Z; N6 o9 o% P! g7 o, k; ~2 I9 R
1 E1 l9 \; t- }+ h+ [
即前三位不为010,而是0117 y* G7 Z) W( O5 Q
4 M1 P# V2 G5 T7 J& K L 4 L2 c: |1 S& C5 n: G; w
U& Y2 ~# T% P( K( {1 D- \; u直到获得最后一位
" F' ]+ W& K& ~2 w8 v W3 t8 Q! L7 O% `8 d D, u5 i: A0 x+ `6 R4 B% W. T
' c0 h& D) Q) S3 D* {! A. V; @1 \+ u! i2 x+ t d7 D/ Z3 U
最终结果为:011100107 c/ b: B0 M" z
- s7 |% }$ B2 h* Y4 l4 {8 Y
1 J: k- s b/ @$ J& Y6 {- r4 W$ @0 r4 d( ~3 f8 x
转换一下:
3 Z* I. v. s, Z1 l& D/ [0 n+ t4 e# U' z
4 r5 R3 X& g7 `( z8 u: a9 X* X0 I2 A, y4 [' X8 l9 }5 o# Z
select b’01110010′
- [9 O9 A- F2 c" c; j; i; g' j- @6 l) s9 a2 W1 j
2 a3 w# X9 F2 [% l, b2 {- J
* z* O5 l# X- U查询结果9 e: d! K8 p( `2 Q2 U* ^. g
% ]- z! b) `& |. s- i - s: d! b8 t+ i( p, A7 A
2 S, N& V7 I7 S G1 M$ r+ [
+————-+
0 K5 C+ g2 f5 Q! [. f, V" h$ K0 i' z. `# O9 U
| b’01110010′ |
1 A+ V4 }" `# b! e# d- a0 }& l' L8 X! P& |3 x! x
+————-+
4 i4 s; Y/ M6 N6 A7 B5 B3 a3 N3 \# ~2 A" [% |+ P
| r |! \( e# N" e9 l/ ^* r4 j1 r
; e- B+ d1 C* E2 L( q
+————-+
( A/ ? O6 O' D, H& x$ }5 N, r+ A0 h% l4 O* b+ f- \0 a1 Q
1 row in set (0.00 sec)
3 ~+ _6 L. k- Y- V$ l8 E0 V
" B& U9 e0 ^. z4 f c : C/ |2 K$ R% O0 f
0 P/ r9 t8 W! l& M" d* g; A这样我们就获得了user()的第一位.其它位依此类推
# m R9 w! E9 G' O7 B: M
) T3 M. u3 m! _. Q |