通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
8 m6 G; T6 X, c3 y7 o6 u% C5 F3 f$ [9 @0 o: {; m' V2 ]( R, v
4 l2 Z5 E( O5 e* N
, ~5 |6 K6 _8 ^+ n* h$ I下面将以查询mysql数据库当中user()的第一位为例:, V: g k/ r4 z; Q! a% O0 w
+ M$ A% ^3 I2 ^9 w+ ^
9 | Q" S7 L( U# l& h5 t. o7 `, O9 P% f7 [8 n
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)" ?9 l+ {9 o; L$ g* z
L# u# Q8 V( y6 F3 a; _2 c
3 p2 y2 r, r. k0 h, K
9 { k o3 Z( o% j首先执行如下sql语句:7 v! g8 @3 p* [* F2 d! n
8 R4 }7 b; }' ~9 [
' ^ z; H" k, W0 r& p1 q' _3 a
# ` c) Z2 \ B2 S) Amysql> select (ascii((substr(user(),1,1))) >> 7)=0;- L! d" m3 n7 o& f& F" `# J4 u' p4 J
" x" E& Y0 q: M3 j
# w/ P3 a7 v! z+ U7 U. H
: O# B5 d/ J/ ?% q! l5 S我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
% ]$ e! f( I, U' F; d& P% X
; \: Y9 j8 `1 E& t, I* I! Q; E
; f8 u7 Y' F0 P0 G% m1 g1 m7 \
9 b% a1 H" L; z$ v3 |, J' c第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为16 t) Q R/ N/ B4 k3 ^5 L
6 A: N3 o) i" M9 o3 T
" `6 p! d/ z& x; l
# @2 t4 }$ d. N' b
如果运算结果为1,说明第一位为0,不为1
) `8 M& y2 `% o4 r
9 ?. \ h- k4 B! {( K/ g: I 3 c. |3 k" c- Y+ w
+ u5 A) m4 F; z+————————————–+
# E' y5 ?3 W3 H' g: b% F- e L% ^' X- m
| (ascii((substr(user(),1,1))) >> 7)=0 |! H. l- k2 s+ n
I+ T! n/ j9 Z0 y
+————————————–+
0 R: P6 A P) d9 m( M; Y" e7 k# l' ~
' M4 T! W9 `$ u' g' r! f| 1 |
$ P3 b" K1 [* S9 o) _- D
) n& r6 T6 C0 | t- F) ?+ }+————————————–+
5 p0 f4 S6 V+ e" l
. v7 ], H* r- j# E1 row in set (0.00 sec)
. }; q' B {1 i3 Q& W- c9 R
t( k2 a$ v3 M, }" {" T% R q这样我们就确定这个8bit的ascii的第一位为0* _! C7 k' H8 _9 a& m
2 w' x' }: P8 m8 z4 z% E0 R # R8 T/ `; k2 R" d% @
9 ^; v0 w. N: [" `* B
第二次我们来做6次右偏移来确定前两位* p1 r$ O3 n7 d; |" E
) k2 M5 X0 J0 R/ [4 L4 Z
8 b) j( j) `2 I+ H5 E( A: S( z# k( n
前两位可能是01或00,即依然可以与0做比较,
! w' Z7 T) _2 K6 w# ]8 u8 n. t( H6 F! v: x0 i4 J$ x
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;+ _" q' _. s' [- i) l3 ?+ i- z
$ u9 q1 Z6 @# `$ K/ E& {
+————————————–+' d O# g6 @ t3 U3 a
* r$ X) W2 [8 Z! c. Q. I0 s$ X| (ascii((substr(user(),1,1))) >> 6)=0 |& c9 n( ~; H( Z& ~8 y
; z3 E* f" M; c
+————————————–+
) S+ ?' `1 O& C/ I5 ^& U" v0 N; z3 y& W. L+ X0 R+ L
| 0 |
+ O: T3 W: x% {, ~1 d; G8 F3 o/ \' _7 U: ]: [% W& T+ d/ c
+————————————–+
# L5 B" _- S. I$ [( Y/ P8 x1 i$ j$ O
1 O9 r0 T, ?+ ^/ S: [: e, K1 row in set (0.00 sec)
7 K8 z7 B; p( X- P0 G. B/ X
! R) g6 S* U/ u# \7 a
* X. d& }8 \: C: N% h) t. N7 i
结果为0,即第二位为1
. y$ E+ C- R* \* A) b
9 J, A1 m" h1 k: H3 @ : }, D m" f* J& A- P/ M; y
' {$ ]4 r$ ^" g9 g1 H
开始猜测前三位为010或0119 y* ~) ` D5 h3 `
% z7 B6 l+ P4 c' D! m- L( @- L, ^ 8 `1 d1 E4 ?- }: _$ v1 }
9 F9 ~2 f' L% A9 h- |+ g* m7 X/ _
让我们看看010和011的ascii码是多少
& j. q; `* p3 n; @( j8 e8 j( O4 `; m
$ o) U' F! _9 J7 U3 _& F: l
! J/ P% A* v9 [2 H分别查询select b’011′ select b’010′
9 F" Q J |) [! d& q
) Y: w8 J+ C0 w! {
Y) }( @" E6 M* z4 v
* ~6 A' n' x3 X P% Q5 F0 a获得结果 010 = 2 011 = 33 O2 N& ?1 l" Y4 V' p- C9 z
' ^1 Z; ?) C, P# \
) v# q& G! W: u' Q4 Y( W2 E/ ]; R3 c; b2 x! J; @# @' F: V
执行如下sql:- i) B+ a* g$ `$ ~
: J. K$ O4 q) h1 J1 ?
, y, {& |( y! p1 V
4 I* S2 }# r- K# `( Nmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
* C) O% N- b4 m. }
9 K9 ?% Z3 n/ g+————————————–+
2 ~$ |5 L" O% N7 N9 m' M/ @! U5 f* r) ], d
| (ascii((substr(user(),1,1))) >> 5)=2 |
$ n/ |0 L" b( f' P9 x# q" i3 n8 H/ [5 b
+————————————–+
+ v0 @# v+ \% O. C) [
5 }+ |" j& P, J' q* ?) q7 I| 0 |2 r n. Z; O' S: W5 ]" G
?+ {. Z+ r6 P
+————————————–+6 z9 J$ X( e+ p8 |; G
1 Q3 y3 e8 N6 M& h# H; \
即前三位不为010,而是011
2 \; n# ~! B7 F% g6 U% a9 l s1 q+ I: P' A# Z
0 G3 u' T; ^8 I! ^5 \7 Z5 Q6 m8 m& d5 j+ Z d7 l* |+ q$ S" n2 [
直到获得最后一位
5 u& E. e# m# w% ^; A" O" ]: s! X" _
- x! a3 Z1 [" e- `% O! T; b) F
1 x) B; Y$ M0 A1 d3 B4 C# d- }最终结果为:01110010
9 v; w' A" j' S( T, K" }; b: Y# r; D5 S
$ I) h g! W7 U0 g. D0 ^9 \( r, ?6 ^4 A2 P
转换一下:& H G* s0 m. a M) E
. e ]+ ]; l0 r* L, W/ v7 F# I ) v6 l! t% v& v9 l" K$ ~6 d
. z% ]8 L) h) }: Z2 f# Q% l5 K
select b’01110010′
& ]( m* g: I, S* J5 m
) E! [, ~1 {7 o7 W! d 8 `8 H% I. K2 r; S( H6 P/ z
( x' O. Q- a1 x8 ?7 y9 J查询结果
8 i, v/ s% ^7 }* u4 m! q7 k1 a3 v) H
: X# l' s8 T- S 4 d( d8 g ^+ W1 F
- T$ R! h" q0 D
+————-+
( H7 \" F x; R8 [! |3 q7 ^2 S1 ^7 T6 Z4 ?( E) T) V
| b’01110010′ |$ N1 |- S# @( j$ n
9 b+ o* u8 W) F1 k, N: k" p
+————-+/ ]# D4 w( |" F/ F: X6 f3 n8 r
# _/ `: n7 E$ o+ `9 ^0 b% U: W7 l
| r |
% d( w, ~# j5 J5 V* J; j" t
, V0 x& g* N5 d) j! B1 U# c+————-+3 U* E1 m7 ]" G. x8 {
5 Q7 Y, _) t( _: H8 F" A1 row in set (0.00 sec)6 k( W* d* @$ m' Y0 W
6 |4 D) j p+ m5 k5 g
5 o6 ` v9 g" E, F! h6 y& s( [7 j; K" E% C
这样我们就获得了user()的第一位.其它位依此类推7 C. r k! ^" B' M3 S* q0 L
; i& B! {( M' T |