通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
; ^& O. M( p9 o, H4 K# I$ J# V3 @2 K3 C+ o3 t6 f
7 {, e4 J/ U& V$ n% p; J% L
. B) H+ [% t" w9 Y& f下面将以查询mysql数据库当中user()的第一位为例:
5 c/ V. v3 E6 { B. @- j6 S# M* I9 B9 g( s
* ?! ~! l! Q! H8 ^# [- |
' {( E( g& j2 y* _ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
+ P4 M( b& e( q7 c) [# T2 D2 ]; @% \: i( z
: q8 r' M+ Q8 `: m: G+ w/ h/ u8 m( w) ^+ U9 w% W* i/ Z2 K, F' c
首先执行如下sql语句:
) B# e/ B( N9 e) G4 m/ u7 {. ^( _
. O% x% H0 M+ S# n: l' O- v G 2 ]. K( S' }0 S6 H2 r3 c7 r; N. i' u
" z3 M3 f! s* _mysql> select (ascii((substr(user(),1,1))) >> 7)=0;5 j8 z8 Z( y. a f/ t7 T6 [$ A
" ~& @9 ~& _" C, ~4 d
% s! n" \4 c0 Y' Y: M' T+ G
$ w/ ?, P/ F/ U. k2 d
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的+ n! k8 e3 o! g3 g/ U6 E
1 N" e& ]6 u0 W" q4 e , H' g/ S) q7 }3 {! z# t9 Y+ d; g
2 F: q7 x3 o" A3 b
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
3 e0 {8 V, t( [+ j# l
$ F. U1 d, Z& x+ _
0 C3 ^- P3 B& B$ e
' f4 w w; F2 a( M( A; }3 e- S ?$ p如果运算结果为1,说明第一位为0,不为1
" A0 E2 o1 I& z4 L* ~) y: ~& W1 J+ x8 p* p" W) j
) t, `/ E! L) H: q6 M7 y, k& b
% B7 s: p# v: d$ g* U
+————————————–+9 X T( i$ E/ H8 E' I4 ?. s5 o4 ?
; X/ W" t( [: a* F+ {| (ascii((substr(user(),1,1))) >> 7)=0 |
$ P* \8 [2 G% G% c. C. i q$ z) x2 q
+————————————–+; G2 ?5 J& }6 `4 j$ G- k9 Q
' z; J+ L- ?* o| 1 |! u5 |, m' t; b: A. p6 F4 v! `
1 J' K. g" r% G. O! p$ n$ C+————————————–+
- m! `- Y; C& w/ s0 A% s" [# G$ n+ e9 w+ ~2 {' ]
1 row in set (0.00 sec)
: g! W4 W5 \" e6 L
, @' r' r4 A0 O( n9 K$ L0 J4 z这样我们就确定这个8bit的ascii的第一位为0; ?8 J- @: ]- G& x3 U/ c1 v
. y" W4 z" w1 c7 D, t Q! C
+ Z E/ I( c' f9 q4 ]7 s
1 n8 Y U' |6 {% T* U9 W% @: e* k第二次我们来做6次右偏移来确定前两位- v4 |- i6 i6 f/ q# D" k
, G' l* H' i. j7 g& a9 ]7 @
7 I! O1 [6 e" h
" t2 f# E. _4 m
前两位可能是01或00,即依然可以与0做比较,
" f; p2 e: R0 j1 @3 A/ K
0 C0 \6 d! k: b+ L* W8 |/ cmysql> select (ascii((substr(user(),1,1))) >> 6)=0;
5 G! P' I; [9 @* u' Q! | ?8 m/ j, U+ u- _+ u: T
+————————————–+
; B! B) s; Q( A( J1 S0 s! }
, K5 ^: S4 W' h- K! @* f| (ascii((substr(user(),1,1))) >> 6)=0 |
u5 p, F0 ]% c7 [2 M8 I# j1 I4 F( }$ e0 g* c$ o
+————————————–+2 u& m7 M- Q* i1 V6 I1 {
0 k# a$ ~9 Z0 n! ~7 W5 k| 0 |
' T- w4 o9 Z. @/ {4 G5 N# B. V9 W9 C8 x6 R2 V- t) p- N! w8 `
+————————————–+4 M8 A* r" o) ~* ?( ?* ], s) k
7 J% M/ Q1 @* \" I, C F7 j, f1 row in set (0.00 sec)% h8 ^- B; b; {* M8 E# N
3 L4 d5 z+ O% Y* o1 N& D
% c' U4 S2 b: l3 y1 C/ X0 V
7 s; n) [$ V) @; b) }
结果为0,即第二位为1
9 m( J5 i, h" ~2 P5 J0 S0 W
* y. _8 _$ M6 v6 {7 L4 t n5 J
9 J' R0 M& y$ @5 |
2 o* i. o0 F4 D2 l开始猜测前三位为010或011
- c0 p6 T- [* k( k
W3 U5 K1 c0 ~
3 c/ Z* Y: L7 p
5 h3 v& d( Q1 B让我们看看010和011的ascii码是多少
' y: b% E% ?. F- }5 g) O# h9 ^$ o6 g3 ?# ?
1 A% ^1 W/ U* d/ H8 \6 x& V
# s- a! N! E- |* e: N) \分别查询select b’011′ select b’010′) |2 J9 M: u3 ~2 e& k- q; V- d
/ X( R4 X! ]) Z* U! a- ?8 M " C) q' B5 u/ _; b' @
) [' ]2 ~, s H
获得结果 010 = 2 011 = 3
0 j$ m5 o( Y, ^/ ^
) T! j7 l+ C5 B+ ?, O/ c; i ' M0 G4 @: E0 J5 c5 B7 Y
- l+ N! S3 v' Y' c K- E
执行如下sql:
) W, e9 z8 |4 N" d: _4 G& u# q% d% N, \7 r- g. ]) _# p3 M5 R* W9 x0 @/ h
" Q" d& Z v' L
2 u1 o& @. Y, k& Y8 {( [9 ]
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
3 Z/ e, ]1 n8 x' G" a1 N+ G1 j4 M* D
1 j, e% I% B, b; ~0 w+————————————–+
j7 Q, z9 l! f( n4 [% r; R* v2 R3 _9 s6 Y3 G
| (ascii((substr(user(),1,1))) >> 5)=2 |
! n; }9 C' G4 ~8 v, C! n
6 m% v: b# h8 U9 _$ k9 G* I# k+————————————–+2 A0 R7 }, K# G
9 \, y* r1 c5 D: Q a
| 0 |
8 e, a6 O6 E/ s) a+ U6 A4 s0 P, O) _2 m- v+ \5 m0 K$ t
+————————————–+) _8 v" Z! v4 a! c2 |+ W _
2 B/ x C2 k2 a% l
即前三位不为010,而是011, `3 H7 k1 l: ]" _# ]5 H5 K
5 r! e" B0 c$ M$ t , K! P3 X' ^* ^; F/ l: e4 v% K
4 ^ r( _) b* G$ d/ [3 P- z! [直到获得最后一位3 E& i A9 n4 Q# m1 Q. A
" S. M0 F+ J. z1 ^, x/ \1 L5 B
4 p1 @% s- m4 l, Y5 g8 ]' x) f5 ~& P$ L2 `: v6 g" U0 h
最终结果为:01110010
: x8 w) P- W3 l9 w* g
, l/ A7 w+ ~/ ~" v* x' r' U5 U! ?, v
n: z1 t" a) F8 X u) Z# m! N7 }. X* s: |
转换一下:; [# m+ t1 q' @6 P) S- \
2 x2 G/ Z: Y& G- Q R5 F4 A1 K
, u( H4 q. H. d, T3 [1 h
6 r/ y7 b) g0 A' T, vselect b’01110010′6 M o: q/ u* C4 r! o
) k0 W; a/ e, |2 [! K" h4 S
3 c+ f7 y- [+ y- x8 i1 I" n. b/ E u2 x6 E; V
查询结果/ C* r" K) ]8 x( T
! }, P$ v! e8 z( j. f8 }
" X* O6 W$ b% Y- h
9 P& I" o: m/ y6 q+ q+————-+7 Q7 ?( N7 z2 M z9 ~
6 V, S. Q0 A" a5 d* V
| b’01110010′ |0 R* N# z3 e* Z; e S) H P
; N# C+ \# ]. z& J1 U+————-+/ U# e5 x1 F8 v! m! p
( S' J" o9 q) {$ U; @6 h
| r |) ^8 |8 x1 z* Q' r- i
( g+ R" Y5 F& P, H3 w- u0 u
+————-+
7 c. x: |* C: u5 p1 Z
0 p: F* ^4 ~! g: q( J) k1 row in set (0.00 sec)0 f j5 c9 F* Z: O: h6 K# j/ l
4 ~6 g# A, ~! d- p# l: x
: T0 M. Z1 e5 s# u+ C
, I3 d7 y0 [$ T) s c这样我们就获得了user()的第一位.其它位依此类推, J0 A3 B4 X5 g7 _
# Y5 L8 e0 ]7 t0 D |