通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
, p$ s5 D- v: F `
0 Q/ b) v7 H8 [0 h ; [! ^* e3 t% |# B+ R
- @; |/ b& b7 [2 Z; P
下面将以查询mysql数据库当中user()的第一位为例:
# R& ]+ g9 u1 s
$ h3 i) D4 \( {& v! }6 I
% ~' A9 m& {+ F9 {* ^! D6 }
. V: B' y9 W z$ T) cps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)- x j5 e; {9 Z' w4 v& R
M F! Y$ I6 F
/ `$ b" j3 r% ]* _- n: l1 W% L. m9 K" m6 l3 I* i
首先执行如下sql语句:* r% F8 y' |8 f5 z
7 O0 C/ k6 ^' Z5 k7 F5 y( t F: C 4 V1 t8 p8 N( d0 P- B5 v
8 D. ~' N& v9 c$ S' n; d- X$ ymysql> select (ascii((substr(user(),1,1))) >> 7)=0;4 Z& i K: Q( ?# G1 |
8 k- V7 [# k# y ! n; M, ]# V1 J- {" N
6 i& K, k3 R) ^/ N: x1 I3 _! S2 _我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的' F7 u# S8 t% w7 J
1 ]8 u3 N7 O! Q' x+ k $ } @* C6 u& _ U3 r
7 W" u& i+ P% X
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
2 Z- W) G y) M1 ~
. G$ y: `! R2 ?1 j U4 _! T + a1 v7 @! x' Y5 m) n/ V
8 ^% ~( R8 {. p/ `. T$ T
如果运算结果为1,说明第一位为0,不为1; D- y8 G6 A" x7 a0 ^. I% h6 q
7 S; N, \" ~, g9 E# W z3 h " W7 e2 h& s7 t
3 C" t* n& H# W9 i4 _+————————————–+
; K3 x- B% H$ a! }! a2 t
; P- W1 T2 m- |1 F3 || (ascii((substr(user(),1,1))) >> 7)=0 |
. m! L Q; R% T8 z
3 B7 b" t* P0 C4 M# T6 h( M6 q( L+————————————–+2 a8 g% b/ c) w4 G5 c3 m* g
" Y0 P% {; G% k! B: h
| 1 |
. y* D* B$ F' n `# C2 b- u# o! ?9 Z3 k' ?; P/ d( Y
+————————————–+0 i7 y+ X" `5 l2 r1 q
, @2 _5 X7 p4 a2 Z! P' [3 z! c: }1 row in set (0.00 sec)4 S5 J! D* ?3 t
" T. C6 g" v7 R) N8 J8 \这样我们就确定这个8bit的ascii的第一位为0
/ \- r- C7 A: n" W# o& R
+ e' O" U( C, ^2 K! t 3 P! ?) y! Z) m7 Q
% ?2 D0 x+ j6 ?; \; G第二次我们来做6次右偏移来确定前两位
7 f" u% ]: W! y" v! A# y" u
0 x- S+ f) x l# h, `1 Q
. B- s0 A$ b4 I! j u! l1 u5 m* ]8 W2 Z" r! `, f
前两位可能是01或00,即依然可以与0做比较,. h1 ]+ k _, @, B6 o
5 Y1 b! \/ @# q* Y( C* H
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;7 y- U3 ]( T: n0 e' J
6 I& B8 V3 x5 [1 L+ V: o- f
+————————————–+5 @" @/ e- y0 U3 G# e
4 S$ q2 k( F3 e1 W J| (ascii((substr(user(),1,1))) >> 6)=0 |
9 ]# W. H; I% H
) O. Y% [+ E& h( { p) Z& ~, D+————————————–+
5 ~" @, {, h( U3 }0 z0 X5 B8 S3 f8 o
| 0 |
' s4 W% s k+ Z( V( B3 t" Y
; j" w( }/ I9 ]* d+————————————–+
' g" T( _* o q! t6 E" H, Q6 P, F9 y: k
1 row in set (0.00 sec)
2 B+ k9 Y: S d/ j) W$ a7 `. K6 V/ R- B$ Y: j5 f$ ?/ H3 W
( }3 y; k5 R+ J& N% z" ]
" D/ E I- [6 [2 I* C结果为0,即第二位为17 p6 O+ l6 @- a- `3 T
( G6 v# [7 |4 j3 r
{( ?2 V6 i: C/ Z3 z
- m [" ]$ L- R; u0 U开始猜测前三位为010或011- e x5 h5 ? g2 ^/ j8 Y9 G5 A
- Z4 [* ?, O) Y' ^! L) ?- y 3 S. `6 a' ^$ O, p: Z8 W
+ d# a+ |: Z9 P/ f9 _: ]让我们看看010和011的ascii码是多少
/ {6 Z. v! }! X; f
. L r9 _' W2 Y0 M# m9 r0 I
6 V2 P1 X0 A7 ~
: w, K+ n* p4 k6 _- N* X% X2 P分别查询select b’011′ select b’010′
' R5 Q* O% D" I- Z& Z5 m0 e! I b2 Q5 Z! Y- P8 W# T% W- [
; u; w) p0 l4 d( Y- U, g z7 R# o! n
0 l" |" y& b5 ~ X1 R* ?5 F获得结果 010 = 2 011 = 3
% Q0 c5 i# @2 o6 }' a7 n0 u) o* J, q
7 j6 I& m |( G% F3 @5 G ) |* L/ N" w6 n
7 _) U( e: v! j: i3 e4 K2 b
执行如下sql:. |1 \7 O# o q$ i; [
+ X, t; [. c D( D1 X
1 v7 Q2 m- |! R R" f2 S
7 `4 n4 K% a" C& V# {" Xmysql> select (ascii((substr(user(),1,1))) >> 5)=2;7 P# U+ A6 x9 {
7 l: m. @1 W2 H; ^
+————————————–+% J$ A: \: e. y2 G$ V
' ~9 k) ?7 m( o, m7 g/ m: k| (ascii((substr(user(),1,1))) >> 5)=2 |' ^$ y$ W$ l3 K% S# y
8 z/ w% J7 ~# e. ~1 C/ V7 R+————————————–+- |3 d6 w9 M ]# c! F
( ^5 }6 o: x( V| 0 |
, k) D6 P6 m% p% g) E# R
: Y* A8 i5 L+ g1 @' U, t- N+————————————–+# H+ J4 j7 }8 s7 B5 K1 f9 }8 N
9 r4 N/ E% K* J
即前三位不为010,而是011
4 ^% \; O7 |& z" I# y; V( W0 f9 h4 [, q6 i. d9 {+ g$ j: h
3 Z3 T: j, j: \; _$ s' n
% h) a7 e8 J# W& t! f% C直到获得最后一位
$ ^* Q9 v9 z0 _/ H
* I9 h' L9 M# z5 Y! d7 N
, x0 T5 F/ ?- J w) E) z* Z3 f1 i& |% a1 D; j! z* O
最终结果为:01110010' w8 @( U, A" x1 J! z+ V$ B
8 Q1 }: s: l* C
0 B$ M; R& u1 S3 V2 N7 E1 U4 l D) ~2 X+ b2 L& z7 R7 b
转换一下:# I; v: |0 D& `3 R z0 B
?5 k% c% @2 i4 |1 F5 q1 B0 s" U
3 v- t" ^+ q: r! V) h3 Y7 @ u& g" m9 t9 ?
select b’01110010′1 P$ B1 Y5 W4 y$ [0 L
3 I8 Q" l8 I# B I* Z
- _ C) ?5 d. c; H: g
I/ X3 ?( T8 ?; `6 ?: q查询结果
) v7 g( [& U8 r7 [& V% Y& ~
7 L U$ C" _8 d _" L; R% E ! V$ Y |0 E# X! D# I/ I
) w c$ H1 r0 P+————-+
$ F, b3 y! K* J5 P# g6 H! y9 u, T" N# Y0 i
| b’01110010′ |
# v* H# R% I; H. d* a( O' `) z& o" @
+————-+
+ n9 i) p/ y" h0 p9 Z' f9 _
8 t' V" g. Z; @* F+ E% J4 e6 H| r |2 }% W+ x3 E0 @0 W* O
' W9 ]8 O4 M+ u5 V+————-++ S. K; r$ i" q' U! ~
: \! O0 m+ }; a6 {
1 row in set (0.00 sec): U/ G* V6 z( O3 {( W, B
6 c4 T! e, S3 R ! x% U: G ]7 v% P) ~5 @8 E" D1 ]
1 J' S) Y+ }& K6 l( h, _4 G+ R
这样我们就获得了user()的第一位.其它位依此类推
2 x K9 N! ^4 T) o* n: F; S4 C B7 a( N8 e6 v% }0 p
|