通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位' c$ |5 T$ V- ^# L2 O
% Q0 q- m( ^4 b; [& i+ i # {+ ]5 b2 }( T. G e% t
6 ~# _3 b1 o6 A" e3 P
下面将以查询mysql数据库当中user()的第一位为例: o" e9 a! O; u- D+ O9 H
) K8 G9 L5 j p; \2 P' w) N7 Y
' s9 j& N! H/ p, _" m! y" D. X% U& n4 s' \
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1): N5 T- u7 M. x0 S" W
! K% B! G6 \, C/ G) k4 |) j
6 a! m/ n, M: s
* s, b! a/ @: Q3 P$ l" c首先执行如下sql语句:
7 W1 i$ D0 E1 I+ d, q& o; l7 R' D/ l" D
$ y: i5 \5 f/ F, Q+ a( } 7 i8 ^4 ]; ?- Y) s3 S, c9 V
8 R8 e3 R# F2 _mysql> select (ascii((substr(user(),1,1))) >> 7)=0;0 I- e/ K$ K4 }
1 c- x |8 z% N' E3 S/ a8 ~7 L" W
0 v7 V6 y) F& R2 Q* ~; U# |, c
- H6 n: |7 _; B# ^! A6 A
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
) v+ m6 M' I8 l5 W, @. E/ r: e7 h3 K+ F* }% ~8 E! t& S
* A( v, o- t9 h3 v+ k
! z- e1 t4 v$ H% r/ i% K) \0 ^第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
" E, z, N6 _. f$ l8 P1 [6 J, |9 R' p4 c8 D4 w6 y
, R( P& `$ I. G5 O. H- K) X2 @5 @' ^9 Q; y) ?) u8 _
如果运算结果为1,说明第一位为0,不为16 C3 n: y$ [* U: O, `% w0 }5 [0 d
+ S# K% N5 ?6 k; L' V- q, L1 [
/ @. T$ v* d6 i# P0 y2 a
4 n5 m: v! N& B' w+ B: g+————————————–+; ?) T4 O# {, h/ R
7 p0 j; g% N" N R; M% ?
| (ascii((substr(user(),1,1))) >> 7)=0 |0 C) d+ U$ j1 P$ R( P+ G
* H- _" ~! H1 I f3 t+————————————–+% M* U6 i! \( P' O6 K- z
9 ]; Y' m! Y/ G% v' @( e- F
| 1 |8 d" _0 `: l: R$ l
2 K3 e% _' V) d3 B+————————————–+
+ k! S3 \6 Q9 l+ U
3 d: ~5 Q% @' e& V. S4 T( j% g1 row in set (0.00 sec)
, J) `) M1 T7 ^6 ~. {' J: t+ q8 Q* J) i6 g* Y
这样我们就确定这个8bit的ascii的第一位为0! h3 m* p) ~+ N. R: G& d% P
+ A4 r. ]) v4 I V7 z
6 z2 O. ^1 ? F" l% K% \' `. G l2 @+ Q3 M
第二次我们来做6次右偏移来确定前两位1 |' y. w5 T& L5 T _8 K
$ p; Y! k& a5 z/ @2 e3 m A( R
1 W) i# q$ Y7 ?% t1 X3 b0 T& B! ?; K# T( \2 t2 W, w0 T
前两位可能是01或00,即依然可以与0做比较,
5 D$ z3 I9 T* l6 a( m# \7 {0 y% M7 ]. N5 R5 |; G
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;9 u+ ^! R ~) m n+ Z
. T& _3 ~! X' r5 e8 v' o8 h+————————————–+
: `% N. p) [- R- ^7 ~
" m2 u, Z2 Y$ ~# i$ C( X| (ascii((substr(user(),1,1))) >> 6)=0 |
( L4 M- E8 Z( d. O- N8 V# a' |; H
8 i. z0 q5 Z- j$ ?. S" W+————————————–+
7 ?2 }- T4 F! s3 f
* k2 m9 b6 P, B' m- R, E| 0 |
* f1 P3 j. {' T2 f& l7 E x- ?/ e$ l) N& y3 n* S0 m ^
+————————————–+
: k# w7 S1 i6 u& I7 Y
F! F- t# \) b% s7 a8 Y. D4 H1 row in set (0.00 sec)$ \+ g# R% f l1 y7 l# ~8 C/ L, b; I
6 C, U! g$ i" V: x1 v9 r( e - K' L$ \5 b$ @ i( v4 q) m! P
/ Z& l+ E: p" F- T0 ]7 w0 r
结果为0,即第二位为1: K* `0 ?' i9 B! ]( K2 W/ F8 i
7 O& u2 g5 j U! `( p! T7 C" `
7 j# {6 V9 h4 C# }* v
1 { H0 k! ^& `1 y% _6 Z6 p开始猜测前三位为010或011+ A4 w R! q0 ?, e) z! I, P" K, P
+ W) h" G/ h# P Q j( p+ O4 l7 @0 k* f & w/ C( n; j! b- s, o2 k3 |4 x
, u$ B, d& V$ T/ G
让我们看看010和011的ascii码是多少
4 W0 X" s1 |9 T9 T1 ? S* B4 y) [1 C. k4 z
8 U' x5 ?, U a% l" J. I
' x* H# l! P. w2 f7 q% ~# q' [分别查询select b’011′ select b’010′, [$ d9 ?0 c2 l. _, S8 ^
, s, l; J/ m# y+ t8 u8 C3 q' h. s6 i
* y# P H! q6 D! \7 j* P- [* Y6 y; c9 _+ ~ u
获得结果 010 = 2 011 = 33 `$ C% d: `; |' [/ y6 h4 J8 c
8 U0 W' c6 X5 H 9 w* B+ a6 D. b4 ]. S7 I; Y: Z
5 X8 ?& O" a- i. M- z% J执行如下sql:+ L6 l" `8 K7 ?; G4 O2 V* e
& C+ s. S+ _! ~( K# |: h
5 i1 h/ y, S ~+ B2 J
$ \* Y1 j( W% F% T& \' W1 n6 ^mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
- t- s, A, B8 ]/ k7 f \5 y" v8 E/ i2 _
+————————————–+
. v! {1 ^. I" N; k4 `
: x! [( I( F, ]1 R| (ascii((substr(user(),1,1))) >> 5)=2 |2 B9 @/ C9 t+ e& y) Y2 |! M
2 E. w# `" R3 S! F7 c0 s* t+————————————–+- O# z5 b( M7 A7 ]8 I9 |
/ v6 V- t+ B8 J! {
| 0 |! G" N% h$ U3 ?8 u
+ c9 q: ^, \# c4 G
+————————————–+
; w% U* Y- ~ ]9 b% I+ v4 o+ K) r3 X/ ?0 C6 o; e% |- x
即前三位不为010,而是011
( C% O* ?# a. M( j7 x7 T) C7 O! ]! ~4 W) u' Y4 Y1 [; N+ V% z N! \% G3 G
; v/ K3 F- D) |4 X
2 s1 {/ S9 r3 i6 S0 V
直到获得最后一位$ M( }1 o! t% v: Q A
# {: H! s, J- [7 j ( B0 O& W, V* i- _- C
5 j& |3 d7 Q! s, s# W* c% `' X
最终结果为:011100102 V- Q! f& K D+ m
& i$ T) u' ~- i
/ w9 V9 x% v, }
& y8 V- D! r) @' V D9 e
转换一下:0 `: E# h% K* x6 p L
, q' z1 |3 U- x' ~8 R' c1 \* K6 y% s 1 X( R2 w8 k8 I) e% [! Q# Y
5 f+ T$ {- }) v. jselect b’01110010′, v. M- E3 n5 y+ Y4 z u* F# s0 Z
9 d0 `, L; D# [3 F' ~6 p
3 `4 x# i9 f0 e3 ?7 o# K1 r) V" V1 H. ^: s* J7 k, |$ }; y7 a
查询结果- S9 i- f3 o& c; p
2 Q7 H+ e6 U# J8 |. [2 t: \
+ b! i" v V+ f! H! ]; v) O
1 `9 a$ I0 E3 Q, b2 V6 T: J- s t" F+————-++ Y3 h1 E3 T) a3 d+ X
. S4 C/ O+ m& ]' l4 f# M' u, k
| b’01110010′ |/ _. I) R! g7 I5 v9 L/ U! H
% U, B H6 T2 N% Z; G
+————-+! Y& }' E7 J$ x5 y
8 @" ]& o& _( s) H
| r |, E; f* a$ [9 K% W1 ~* ^' H
: O, k0 P4 K3 ~) G9 W" S+————-+) K! z, ?; y* A+ R& y: y
8 ?. I2 j6 u) X* z% k) r4 h) x1 row in set (0.00 sec)5 G/ q" j3 Q$ d) [! V3 m: `
' k) [2 i/ r* N1 F$ f
6 s7 J* Z8 ~0 s+ _8 p- O
2 S8 d4 S" d( C8 `- v, e这样我们就获得了user()的第一位.其它位依此类推: P9 M$ m4 p0 W0 w$ E6 Q
1 f) M4 z; Z. m/ @% w: o r; W
|