通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
$ ^1 N! ^4 P0 c2 M: K# Q' p; r4 K( g8 \8 A
( o1 R$ R z8 e9 C# n& {) h; p( r! r X0 l
下面将以查询mysql数据库当中user()的第一位为例:
/ L( o; m* l# r# Z- d! I" i M5 M+ T+ R0 g7 F% u1 ^1 Q& R
8 h0 B/ _& u8 g9 R
1 ?3 o& P! j' i, D/ ~# H# yps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)% I& h) [ }# E7 X8 A% @& p/ C
# q5 D7 @' U6 g% o0 B- J+ E / S: q9 Z9 ]4 a0 h7 o3 j7 y
4 I* C8 \/ k& L; [( n
首先执行如下sql语句:2 I- X [" M8 Q8 m; w! J1 ` j
" S1 c1 c) ^7 O
* r% i2 f, `9 n5 _" u! u5 Z; |) a v
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;' J( _8 r& I& w% g Q# j
t @* Q9 z9 | 8 k$ }4 Z; Q; Q3 v3 H, m) d
. ~3 k9 v' G, n) i' J) e7 L; o
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的' d ]2 g, }9 H& _
& c! {+ y0 f3 C* w3 o/ A. v
: Q% R$ y9 r$ T3 s( V
+ }+ h& O- i/ k( }第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
5 Z- s( A P; m; X6 r9 [1 \$ @* I( l/ Q1 [" }; J1 h n; u) U
8 x2 A* B! P0 {" K3 W* S2 D7 b
3 X X* u" g/ f; \; o( [% B如果运算结果为1,说明第一位为0,不为11 `% V% Y0 J5 Z' I& ?# e% h
( T9 n5 [/ V9 `+ Q- }3 e2 c
' w. E" S9 ~' T2 c% }1 L7 u4 P3 w9 G* L! E* ^
+————————————–+) V! [! h5 j9 S7 R8 z0 }* n3 V$ M
: B6 b3 D- f+ _| (ascii((substr(user(),1,1))) >> 7)=0 |
; T$ V. Z7 p' _4 @8 w/ q* M* T, q0 D, R& K) _; ?* ?1 t- ^+ s+ b
+————————————–+
0 `& J* ~6 {8 l! v' f5 F2 I3 P! Z4 {
| 1 |+ C |$ y& w# Z9 v p6 ?/ W
* n5 [6 M) p/ w# e- G/ q+————————————–+
. O) D4 G8 S8 X" j. m F' V: @7 D1 l3 Z; J* z. `6 i5 ?
1 row in set (0.00 sec)
' z5 g/ x3 | m( N" q- Q( j5 t& D: K; j( d; }
这样我们就确定这个8bit的ascii的第一位为0! w. j2 e% D5 q- m
; s* K( Q. n- j' n
) }, h. D& j; T2 y9 { V8 S% @$ h+ A) u; C" ~3 n
第二次我们来做6次右偏移来确定前两位
/ N& |# Z; N' q0 i- s3 j Z" u) Q0 m" ]9 i
) M6 S; D$ d0 x' {3 o# o n
1 ]2 L4 `' Q# w前两位可能是01或00,即依然可以与0做比较,( L0 i" R0 W U# J* Q5 F9 ]: `+ @! r
: q' y y2 d8 G: b
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;9 q7 {. I1 T6 d/ b9 |8 A% h$ K" @
+ W: n7 X9 {- P/ n b2 @+————————————–+9 y/ Z2 [1 Z5 |9 N5 v" v! g, @5 q
/ Z H& o4 V! F0 P. o
| (ascii((substr(user(),1,1))) >> 6)=0 |
6 l) Q1 I( a0 `0 c; v* j; y' j# w; P! C; ?
+————————————–+
" H) k- |4 K; Z9 I- B" o( L0 b) G9 O: B- S& C5 _
| 0 |" O! c, H1 N$ b4 \9 d% j' `
4 l" P, C/ o. c8 w! _' r k
+————————————–+, Q% k9 g. k/ y+ r9 l
8 x/ |# M' Q' A: o9 D; L1 row in set (0.00 sec)
: q; `3 |; j7 Q) C8 I4 C2 y( X7 O* z2 @, q4 P0 e% R! e
1 G+ n) w# b2 z" H+ d
# Q a0 t9 V/ G" a/ m0 r结果为0,即第二位为1
+ |* t) L+ [$ k8 m4 f& \3 r8 w, Y& i- b1 u4 T
6 f4 _( {2 { t3 ]& z! H
+ H" w7 a5 K8 ?. Y$ @! \1 I
开始猜测前三位为010或011
9 N" x0 x: c c3 u6 C+ u0 o
/ f. ^$ i' e$ n$ [
# m u) W+ u$ G% G% }8 k) l3 @2 n6 m6 x! H; y$ R. [; r3 g
让我们看看010和011的ascii码是多少1 d6 U R$ n! c5 E. U# v) L8 a
4 @9 o2 z1 Y4 C3 w0 z( T$ h" ^ 4 ^1 G) A6 T' l1 G4 @
# v, O# F: h3 z$ U6 b
分别查询select b’011′ select b’010′
+ ] F& F$ t7 J9 |1 |; V) o% y8 O. n L+ i/ s1 s
+ _$ C, L/ G* E0 N2 }4 e: a) V5 y0 b$ v: p/ r$ u8 ], k' A
获得结果 010 = 2 011 = 3/ Y4 E6 L/ H3 d
( @ P; P' l# ~% Z r3 ?& N- d
# h& m. h) u* v5 }6 H
" I: J F6 g, F4 h0 i; p
执行如下sql:8 N8 K# i. S3 Y$ W
/ |0 n' X3 G( A6 W& V6 O 5 n6 ^& [9 s* \6 I) }
8 e. r! {$ W/ g! K2 }mysql> select (ascii((substr(user(),1,1))) >> 5)=2;6 m% {: o9 v# y" d5 p# r! x
* G4 ^8 q4 s: D& d9 B6 ?: t) L5 `7 i
+————————————–+6 ^! ~$ l# ]! f5 ~; M/ ]2 m/ z
+ ~# Q0 T9 J7 [
| (ascii((substr(user(),1,1))) >> 5)=2 |
: n5 Y: O5 u+ d* ^( X9 f0 D8 ?, _6 t) d
+————————————–+' a# F% X4 T& D \' a* P
- u$ ?! m8 O+ I: P3 E! _) H
| 0 |
& y; g' ~/ Y; }0 o f; M
4 A4 Z& B6 B& ^$ r3 @+————————————–+
9 y% ^$ F6 F+ X1 a
$ e% Z3 o9 L' W3 X s ~) v( M即前三位不为010,而是011: N6 h8 I" x- v1 w7 B4 p
' h6 j/ K7 R; ?! R! q) L3 l. `9 \ 6 [) H7 L8 p% y! }! e. e
4 k( I' P5 F1 i% H+ P; N0 `. X! T
直到获得最后一位
e- @8 b! g1 Y5 R8 z) g
' K+ a8 C g5 E# T' w9 Z2 m( E $ u# O0 B- G: \ h" v8 e- Y" j
5 P3 k4 p. V2 o9 `2 m( r b
最终结果为:01110010
7 ?8 l$ ]5 w/ A7 }5 A, a7 N/ I& c# [0 D1 @ t
. g- ?: e6 i5 [/ l2 M
- q% E$ a/ q& o4 {- u! c转换一下:
& e h, f8 k0 o4 v$ z" n
3 {" h9 Y" ~: @) J$ `
% T4 v/ d0 e% p) E1 J! n# Z. m: k. N6 V
select b’01110010′
9 }% S' z: R/ E$ |3 {
7 |& G r5 |: T3 w: n( D ; ]3 y% V: l. k: H- X; F( h
* z6 w; l7 f8 E查询结果
# x- j6 u% Q( j/ J& C& e2 D4 |3 }& J* T3 a
0 V+ ^8 r+ I2 [9 ^
. A3 U2 y6 [, y+ e2 b- z& F+————-+
7 O! Y2 M1 v; @# L9 M+ `( B1 d' ?7 h5 P& S9 \
| b’01110010′ |) e3 @) h% P4 P4 E
- \/ r W9 b( d; l5 L+————-+" w9 |6 j& O q/ w* g
4 `$ D, O. C* p| r |" u7 w: d( X+ k8 d6 v
1 c1 V! E; o0 g; N$ l8 }7 e
+————-+9 r _5 @5 U* ^6 h
( r5 C- m5 @2 s8 T$ W1 row in set (0.00 sec)% Z4 ~+ s, ~( [5 |: O' J! X
. B* M W2 ]& J+ \
& N6 `- O" P# Q1 F3 g! i, D* f/ R; [1 ~
* s9 Y2 E L1 T- u7 @8 p
这样我们就获得了user()的第一位.其它位依此类推
5 W6 d0 w2 }2 O9 W' k2 r; }) V; }7 D- i
|