通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位# ?8 p; c" o9 i( A
& E; y: F' H. p* Q , E* d! A1 O0 O' v2 U+ [# Y- H
. a' H! O' \: n" l0 T
下面将以查询mysql数据库当中user()的第一位为例:
2 O1 c6 h& @5 @5 P; S$ L* y2 q' i' L3 o0 G! R* Z
6 F0 k9 t- b( q! s8 g
7 I( N4 m b, R- _2 f5 M
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
; _+ S( v M/ |' R4 _* A. T0 O4 O- V% k* ?& j' h
% |9 k3 x* ~5 x/ e( @5 s+ P( p P# }# ?& h
首先执行如下sql语句:2 M! [" O3 a4 s% h( J* Y
2 H, H" C r+ @8 w. ?6 y ?1 k
- ~+ g, J Q, ?8 `$ E; G) N% l
0 ^8 O3 D' c: |8 C2 _0 ^" Fmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
) s, j; X8 `& W a$ B5 p, M1 ?
& ]9 }$ b/ b/ m; V; @" u
0 ]. l- z# V+ z8 g6 ?2 m9 F! l: G1 S- g% W" E/ O! w5 X
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的1 q4 V+ H* t8 C/ R
6 p& x4 e- X0 j . z& u7 p3 M) V w- ]4 x: J. q
* |5 B3 L& v! M# c3 m: B第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1, D+ N8 o: `& M
4 S& X5 a4 \% h/ U" p, Y6 R
2 d3 }& R+ z3 w' P8 R; u
7 \' t0 k! d0 @* H* P+ _
如果运算结果为1,说明第一位为0,不为1+ |& W7 r& {. B. s4 c
4 l* t. B6 z# b1 {( j( A9 K; [) z
4 }. u* Y% {; w* q x" A1 p/ r
; Z! Y; j4 q, O
+————————————–+
( a1 u8 r1 E, {, z% Y% v: c) z/ T9 M+ R; e n$ a" M. N `1 ]
| (ascii((substr(user(),1,1))) >> 7)=0 |4 U" J+ h. |; L
; ~# W4 ?1 U6 s5 Z% n( \0 _
+————————————–+
/ w! Z5 M, W9 h# \3 {' w1 |9 t0 D9 u1 y* S$ r$ M l
| 1 |
! f( @2 f3 W! } k l0 m! m
, l" g7 U! w% c; R( e) x+————————————–+
! G! k5 J) G- |; X
: H# v# {, y* @3 B1 row in set (0.00 sec)
# \1 g" @% x- h7 \( _
( a6 X" T! H2 T) |$ o" _3 A; J2 [这样我们就确定这个8bit的ascii的第一位为0
) h$ P6 O9 f2 n# W- [; o9 L4 B+ t8 O- d7 q8 Z" C& A" @* ?# ^; ?5 i
, Y* d3 e: P" b# y
& Y: g+ Z" \* u+ v$ q0 Z/ g第二次我们来做6次右偏移来确定前两位( e3 B7 t( [+ N" C1 u& L s9 q6 o- f
0 W8 `" o" C$ i' V / L) k; G, f, ?& `$ l0 _
% T7 D+ t" _5 j2 l+ Y; S& h前两位可能是01或00,即依然可以与0做比较,
, x2 t, C1 i5 k8 ?
. G: W4 G% j, Y5 Bmysql> select (ascii((substr(user(),1,1))) >> 6)=0; h; M+ l- e& Q Q* m9 Z% R' w# m5 f U! l
5 C/ y# i; U, l- c5 g+————————————–+
. a9 m' R% |. Y* d+ ]1 b, c& ^: Y, G$ t, ?* S f4 @/ ^5 p$ j$ V
| (ascii((substr(user(),1,1))) >> 6)=0 |
7 a, ^9 Y r) u$ R E7 m6 ]- g. o) Z: q
+————————————–+* H, g" G2 L4 Q. a4 W: _
3 n: ?- W2 B) V. \1 E4 E" ^| 0 |0 n! T5 j8 ]. d# }# M- a5 W& B
9 [( S- R9 B9 N/ b* n& l7 f4 K
+————————————–+
& Y# W7 W4 W3 B2 T1 ~, L
$ v% b0 s( z) U( h7 o. v! Q( y* C1 row in set (0.00 sec)! D8 @, ]. n3 j6 ~
( t$ p% b- t0 p, P
7 J$ v$ X% z F; ~& D, Z
R- {% U1 E( z1 x' ?
结果为0,即第二位为1
f W; A) j+ j' X8 x! s
) [& G* l( B9 L, v# o f
d x: a( _; n$ J) x X- `5 j# A& ?; P5 [' n. t9 q
开始猜测前三位为010或0115 N1 ?& q' ~- { ]( v6 ?
' R9 V. f( J& l
1 B# ~6 F0 K% s2 r& J
1 B0 N/ y' A+ r$ C. ^, v
让我们看看010和011的ascii码是多少
, }6 i% V v: d) _
+ {: f2 ^) y- I5 m9 R6 @ 9 n0 W% b1 k: u% y8 m
+ P" l- Y4 V" {分别查询select b’011′ select b’010′ \8 i7 N6 K. N: H: r9 ?
8 G8 v! h j" E4 @; D
, F4 S! b, E. S' `, Q" X
5 D! g- Z: W9 c7 z" o
获得结果 010 = 2 011 = 3' a; v: ]# P! r2 {! K, j( T$ Y
) l% Q w$ d9 M+ g$ t& o
9 @( t# D/ |8 Z9 v0 d4 n b9 \, n: N5 }1 T- X* a. Z
执行如下sql:& I: a8 {9 H, G/ b
* E9 `2 Q# w3 S9 H& K
: g+ Q! ]2 G/ b! M
& d" \5 r5 P3 |2 Smysql> select (ascii((substr(user(),1,1))) >> 5)=2;
/ {+ }( s+ p8 P8 B1 A3 }0 E3 b6 g; }5 n2 f2 z- N
+————————————–+- k, b4 V" _! r5 l+ \9 B+ j! v. p
0 A) k, e; |6 F || (ascii((substr(user(),1,1))) >> 5)=2 |
' R2 S' S; o" |- m0 s4 Z
5 s' P2 D2 p% C" ~+————————————–+. v2 w4 ?$ \) F* k( r [0 Q
; x" m7 s9 \. k- r3 v- }. `) X. _5 q
| 0 |" ?' C! T, i) V' t8 i7 T
/ }- w o/ n* j6 K3 w! A+————————————–+
+ x6 j0 i' w" S$ B/ C' b
1 s$ b j8 M) P8 u6 w* G3 [6 g! G即前三位不为010,而是011
1 R0 q0 Z% s& `( ? _: y o6 g! X' M8 _3 G- Q% n& k# `5 q
" e3 F- v, Y* @4 ]) t9 a8 x0 d
& ^2 J, d/ _9 O" y1 w; y4 {2 `直到获得最后一位( }; z$ H, a/ s# L$ z; Y. P3 [
: W* w- g A! j
$ q% l6 C1 s2 F
# q/ u, Q5 s# \8 B/ B
最终结果为:011100100 i( u. l2 E* X4 U7 `
! q4 }6 L$ D% L2 \
9 W( R% s0 g; p0 N- ^8 u
+ c9 i- q0 d4 d* d4 r2 M转换一下:
; E. ]) E, b* J* W: a+ g! q" D4 r- i8 t
) e2 m1 z r. b# [
- f; C$ l' Y2 E! a) w8 o& G6 {select b’01110010′- `: ~* P h8 z5 n; w
2 n6 s# [5 i$ a! k( O, k$ p
2 v' y. W( S1 a7 N: m/ N) n* U. u& {. a, L% v
查询结果 k! R' a. |% v: x' ^2 \
$ X* W( x" ]/ _, J, I! P# ^# K
7 Y( @5 S1 _$ d; _" v' N1 h% ~" w; x$ x
* Y; q+ n, k5 `- Z
+————-+$ A' _+ k+ |5 A" p
# G2 {; l6 L+ O0 ?3 t9 F
| b’01110010′ |
3 Y. a" d8 s9 t5 o$ P
6 J @ Y4 x( B6 ]" z. E. T& S+————-+
" _3 Z8 F; I8 ~9 @% B. k& L
7 P0 [, i, G' s$ p% o, p| r |' `2 y/ K- W' j5 L
& b7 K- s) n. l
+————-+
: d7 f0 K5 A4 I# o" \4 S4 Q9 Q1 d& C3 V. P$ r& Z
1 row in set (0.00 sec)6 r6 f T" q( _7 u2 ]7 b! z1 c
8 r+ F+ s; N' N$ V9 n7 v
& m" `) ?( p" P; \
, y4 M4 u7 I/ Z" t+ \% O3 g这样我们就获得了user()的第一位.其它位依此类推" O, J- h3 W! i3 \
+ D7 f+ I( X. S* ]
|