通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位/ D/ n: u& ~3 y- o; c% b# ^
$ s n6 [4 j% w6 l; _. E
' ~2 r B/ t4 I. X3 [( K m
2 Y: ^3 _; l+ W# n, [
下面将以查询mysql数据库当中user()的第一位为例: _7 K3 f8 l) x- b+ Q
, Z% G' t: ~1 n9 Q
) B" X7 c& V4 k. V h/ {# H, y% k) L; X5 C8 H3 f- Z* Y
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)6 h2 T9 f" _+ f) z' {2 s! H
4 Z& X; P& [+ V$ [% d
/ T, L9 w" i( U
^3 L7 j L* W4 @- i% P" E
首先执行如下sql语句:
6 }8 A9 r F1 k) n; {: a
" Q2 O& ~4 w7 s2 G% ` * m+ ~5 O" l. v2 p& S! m1 n2 |
1 h( s& t/ m/ Z
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;0 a# ^! H2 g4 a$ p) K) _# k6 L& }- P
, K) j5 Y* ]7 a1 I$ B2 Q' k, e ' ~ N" b( @& [! X
. }9 [' L1 t1 O" }4 E% u3 p; h t我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
* w! c& ]" s% g: z2 @4 n# y5 |! @, s7 b ^0 h# M) s( n
2 N O( O3 V* A; p. A
N* q* S$ `9 ]4 k6 X) J$ q; a8 x" P第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1% w; K8 U7 ~5 ]( p4 \
6 I( P' w* }; ]/ h5 c, c
" ~$ \% D5 n n7 J- N& n' h( l* G9 W4 |6 j1 A( [2 t M
如果运算结果为1,说明第一位为0,不为11 ?: Q- V! E8 F5 [- O Y o& \" C
" k G8 p9 p& g: ~6 n8 F2 i
& s# G- j% s; t( `+ I5 D6 }( v b7 l4 ]8 G9 S* ]
+————————————–+
" O H) S; b& {5 {* M
1 Q* z. y1 s8 [! R$ E# n| (ascii((substr(user(),1,1))) >> 7)=0 |
, S; O! M" ?, k- r5 J, i, ^2 `0 M' V+ \) K! k% ~( ~
+————————————–+
# N# [- ?1 [' Q3 F( b+ x$ D* y. L" v
| 1 |
5 s5 s+ I0 J2 C2 C2 f3 E+ [8 A1 A. u
& D3 W+ q2 t0 T$ j; d6 m6 I+————————————–+
! y% \: E$ t) S$ P2 ^, l
( T# y/ A& W P' e+ B! b# `$ m1 row in set (0.00 sec)
1 `9 s, p: U O4 Z) b- ?5 Z- L; _5 m" E k; q# ^& {, J7 y- j
这样我们就确定这个8bit的ascii的第一位为0% |4 r! s: R% ~- i' q
9 j! G3 F7 q3 @0 H* ^
- Q Q& {8 l8 B" ]( Z Y: n
# P3 G8 `/ ^$ ^1 `& l3 {第二次我们来做6次右偏移来确定前两位
, P6 Q) y/ ?* L0 P1 {# M* k n. O7 |8 c+ Q* f: ^
8 m {9 B, c2 H$ T4 Q/ O* w
# G n2 i6 a3 E1 g- ~前两位可能是01或00,即依然可以与0做比较,
8 @8 F" u: e- [ }
. W- `* X5 n% i; \* Q2 Imysql> select (ascii((substr(user(),1,1))) >> 6)=0;
/ j3 n& H, V0 j" D: d, k( v) O( f7 Y* ?3 M& L
+————————————–+0 I, D3 ?9 p- i: |' C+ B2 F
: M8 J7 Q& ?" R7 R| (ascii((substr(user(),1,1))) >> 6)=0 |0 {6 ~0 U" k g6 M
; n4 u% `, Y. Y7 o3 [! e+ a+————————————–+9 T; m4 w0 a" X+ g" |! C; e) g. [
( e& n) `& p7 e
| 0 |2 \+ d P6 ~' q8 E
( V2 d* l' n/ m9 R) p- Y/ g+————————————–+0 g F/ E( \2 ]% z C
) L% ]+ y: }1 g0 P2 P1 row in set (0.00 sec) o& v" E! Q( L
/ U2 X6 E3 E( ~' `+ t5 z/ G
" {; D6 O( ~; m- k0 z; d/ x
& `3 L% Z" U$ R- @" G
结果为0,即第二位为1
0 q4 g+ U {2 K; S5 L; K% N& Y! X& i2 }1 r9 z" j H
8 m- O* g2 ], {( f8 n( n
' D# E# F; C3 n
开始猜测前三位为010或011
( w) K! v/ i; P' b8 `: c' {1 q5 J3 R8 X$ s, w) |! U
% |/ ~9 e$ ~2 j* r! l
2 M2 y9 Q/ y8 w让我们看看010和011的ascii码是多少$ v/ x! @- E9 e: T, ^0 S& f& p
/ @: t$ P* d2 g6 i" O1 W
' E- m1 B: ~# u% r
& v' u9 l1 y; |7 f0 g分别查询select b’011′ select b’010′
9 J4 f- p: m% F$ A0 r" b
9 Z# A: a, r" E$ o K- b 2 ^ v2 ]& }5 c) G- p+ }
$ @" |( P x3 R' J2 C+ V8 L4 c+ R
获得结果 010 = 2 011 = 3
[9 N, q5 s: a
1 {+ S1 g; E1 m& {
( d' Y, ~& d. y) C" R7 w3 {
/ Z6 i: |. k8 J- R: Q* _执行如下sql:
& |' I$ Z% [" l
) \0 o1 @* f9 O3 b2 N' [# c/ I : y b4 n2 s- W* x
& v0 [ i4 ? `
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
0 F3 ?. h8 z6 {- K2 W1 A( p
# j- H1 D$ w$ F+ t+————————————–+0 E6 j9 [2 R% a$ x9 V
1 ]$ i+ q8 O1 X
| (ascii((substr(user(),1,1))) >> 5)=2 |2 G) K( K; ]# P% S* z
* A' e) E: S9 Y! m1 Z# C+————————————–+3 o" ?8 v( O. p, J; ], w0 n) M
# ~2 t3 u" k# ?, v3 R% {9 ^
| 0 |
6 T& m2 g$ S3 a( f1 [6 V# X0 D) U# h! u$ B: q
+————————————–+
9 a. ]* E$ U4 k3 Q* e& c7 u; Q Y% m9 b: d* e8 \2 m
即前三位不为010,而是011* w, }3 g4 X" [ N P4 N
* T3 H- a4 ^2 ^; j! f* W
4 a% \$ {) a7 ~
4 ]! _' s' J, m7 X0 B0 i) v" K
直到获得最后一位
7 q! e2 S; U3 r7 T" V
% N+ T( E, Q( v
, l9 M' W1 e6 w' Q/ d
9 ?; W2 V& q! {' R. e最终结果为:011100108 A3 ?! l' k5 w. g2 y+ A
9 p" u* @: c6 `' r, s `
+ o! `' @. W" l! N. ?& R" x
4 u9 z% a% n( ]3 B# Z; b2 i5 G& t0 d转换一下:9 e, M% O5 g' W, k7 S+ f1 ^1 J! Q
8 s5 b- h9 y0 L1 D7 s' J7 u
" Q, w/ s: {/ j6 }9 d+ ?4 B: S1 x, e
$ c9 ]% Y- O! f1 ^0 \; yselect b’01110010′
+ n7 x$ Y/ L# d
# i' i. v7 d6 L- V3 w9 G5 n 0 M/ P" c; Z; b( \) J) s
3 l% k6 _: C/ B1 p查询结果/ U o r I8 m+ m
6 E& }5 N+ `. r" N7 j* [ $ X- P7 J) w7 d* n3 F8 ?5 e+ ~
0 X7 ]0 U0 r* Y5 Z! m( H$ f+————-+2 n. s/ G# z* ?- O) R% w5 w
# N0 g* Y/ l F- B| b’01110010′ |& k4 ?- d5 R& U. ^( c! T7 p, E
3 `2 w: @* q6 W, G+————-+8 C! q+ |' K+ M$ r% Q/ H$ D
) B9 ^1 F& N }8 G- E| r |
. Z/ } v' R0 u$ S) D
3 L0 s1 ~( M6 g+————-+
' H+ Z' S8 a* Q* [+ p
U! v5 p2 n( c* f: s1 row in set (0.00 sec)
* M/ u+ S3 p% q1 }
1 t4 m8 ?1 [: ^# e6 w % T* V- \- g" M% D, `4 T
1 ^3 e' ^( A; ]+ F0 N这样我们就获得了user()的第一位.其它位依此类推+ C) t1 B1 ?7 _! C; q* p, o2 l; ]
6 W& B# ]* g1 w& r$ f0 U2 W
|