通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位: S" S/ L& ]7 r/ g M2 }+ e
, [$ I: Z+ p; C% x! V: E% K6 B9 }
1 L. V' ?2 k* j }7 q1 J
2 a: Z! X% ~8 M I% b5 e3 E下面将以查询mysql数据库当中user()的第一位为例:
. v3 q8 {; s2 r1 \6 y
; j) W' l. \) V Q# @' X; G " {, ?8 h) f" Y# a+ ~, Z. }0 F
1 s. n( b' R8 F2 `: M: a) }
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
6 | E1 s8 I- X9 b' p+ ~
& y, j% J: {) H# u* J/ ~6 u " F3 u M3 F3 V; F1 F& r' p# @
7 M. z% I+ s/ \) M首先执行如下sql语句:
; m2 ]" m3 D# q; v t
( _& ]+ t) ?, [- l. @, P* a5 X
5 K; f9 L( t" [# h# x8 R, V- |$ F, H9 v) b0 Y% V/ X
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;( d: C6 L; J5 s0 [0 G3 m
& ^5 J7 D) g7 i/ P5 {
) E, u* t" l1 R- r0 l8 `" R
* k8 w X( h5 H# ^- B; I
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的& l# T h& u/ Z6 q# e
* s" @1 t3 G3 B5 T# J; R, D3 t
* e) d6 K) L( D* r, X
1 S' D, D6 \. \第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1( g/ p j" n, J7 X) v8 i: H3 r
8 k6 s2 P0 a0 _( F: B$ r0 [ . w+ G, n2 I0 y' I
- k0 o; n$ V! z+ v' j
如果运算结果为1,说明第一位为0,不为1* t6 {( ^8 n6 x# x4 K
3 C/ e- h# v$ [6 R/ s+ X% [ k( E4 P1 g* ?6 {3 d4 ~& V# |+ L
/ p2 s5 o. ?8 F' B( A
+————————————–+
7 `6 a4 m i# s% ?" D
- L" U; Z- x, y| (ascii((substr(user(),1,1))) >> 7)=0 |, C* A. S" ~# P$ U+ X; H/ v
7 p6 q1 o" N; U M6 G7 }$ |
+————————————–+5 k& ^. |( q d" t- \* E3 b, [% d
7 f1 \( m$ [5 F; K8 ^
| 1 |
& W3 ^2 r5 G& ^" e/ r4 n* T6 @9 h1 Y& D
+————————————–+9 v. F2 a. M' {# l3 H# T# ], I
6 d! T0 I0 g2 b, b3 S( d1 row in set (0.00 sec)4 ]' `* c+ g) c& o5 Y6 U
+ {: o q% V: R1 z. q9 @8 T7 b
这样我们就确定这个8bit的ascii的第一位为0
" y/ p0 z1 G- a# p% s) I3 E. ?! v% c/ {* j& ]: p
3 M( [7 ]4 [$ ^) V
- n% Z1 L( C% [$ Z0 Y+ d
第二次我们来做6次右偏移来确定前两位& q% [, \2 T: p
7 ]( [) ?3 r1 Q6 \
8 r3 r6 u) u9 ]! U
& T! ?- P& h8 O4 S- o前两位可能是01或00,即依然可以与0做比较,6 F+ Y* p. U" @2 O: x9 c7 F- {
5 a" ?; r$ I, |5 W3 V
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;9 V2 [. L, T, Z. P
& P8 L( \3 g, A+————————————–+
% E4 G2 t' V2 q
6 @; ]! K; v' d- [% ^| (ascii((substr(user(),1,1))) >> 6)=0 |
- I! y3 u, R r/ n5 h i( h4 r7 R( q) }0 l" E
+————————————–+/ L( b; F4 n! y) a% g
! x: S8 b$ V0 ]' D! P2 M| 0 |' a: {1 C* v# h7 D8 U
- [) ]4 T, o# ~* a+ l
+————————————–+
* d: V' F, p& `6 Y4 h6 e2 G4 K+ l% w9 L8 o
( ?( A# A2 _" b9 @" v2 X1 row in set (0.00 sec)' W/ k& L u4 g/ i1 x. f w8 \
1 Q4 r/ i4 i x9 [1 Q- g * C: |) I8 |2 T. _: w1 E
6 u; C! h1 b8 i/ `0 `% v4 [# O O结果为0,即第二位为1! e! v1 x# i7 \/ R' H& U
4 H) a! v7 Y' h1 F1 C6 u* A' ?* t 6 {3 t7 J! T# n5 z, N# v" O# G9 A
l& P' p, \7 r, ~; {4 n
开始猜测前三位为010或011
# L1 R) X* r3 C
9 G0 y# K: S% ~1 R
9 T$ x4 T* I+ l8 G7 h3 D4 {6 q8 ^7 `- \4 g. F
让我们看看010和011的ascii码是多少1 o/ [. D& |, u. O- O6 ~
: o. W7 r. ?0 d v! I( [& D
" Z& B( d; m% X) Y! ?
! k, @5 W' x. E分别查询select b’011′ select b’010′
, ~3 p8 n+ ]2 _$ B2 g- s
7 f( w, P( t4 _3 G; F 8 t: q$ }' p+ K
$ x& W5 i! u& `) u获得结果 010 = 2 011 = 3
5 O8 h4 }6 P6 {0 d( t& S# K4 E' _1 `3 [( V9 O! M5 L
) e, p8 ]- R( [/ g6 L
" Z2 P& ]9 ~5 i1 _
执行如下sql:
* y5 }# [* `; S$ O( e; V2 [3 F
l$ O+ T1 M9 R4 x & ^2 \& E# j/ h: b8 g
1 O( z' A$ [0 o$ x1 ]+ L, F" S: d1 j' [
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
* H$ `; E7 ~$ c: h1 Z w) `: g: \. ?5 S9 J
+————————————–+) `+ ]% [0 s: j2 p. k
4 }2 ]" ?0 X! Y+ W3 e4 a6 {| (ascii((substr(user(),1,1))) >> 5)=2 |
1 P+ R7 U( I' k0 s$ _- I( H9 V& Y) f! e; {" U( q
+————————————–+
4 y: Y5 U( d# B. G" H' C
/ _9 K& Y% J w# ~2 H& b- t| 0 |, \ _5 e4 b0 |
Z* P- U! n3 {. K, {, J1 W! [- g7 P+————————————–+
$ I# y r( J+ O. n/ Q! I6 x+ [. S& l
即前三位不为010,而是011
: j& {1 _0 C$ C0 i1 D0 f4 [
+ p9 |6 C: x s4 [) O) Z
* \( S" E7 [1 h, K: H; b/ h. k) Z* l$ H: N! `
直到获得最后一位
* \. d% s* |9 D8 {9 S, N$ L9 G/ v3 |) ^* t' v4 _ E
) E# T+ u. K1 d4 I& a* H+ j
4 t& {- ]; A V9 Q最终结果为:01110010
- i: \: w: |: X3 B) ~2 [0 O- c; E
* X5 { |. Z3 `6 J # ~5 X; V; [ a
3 Y7 t" F: ^) q8 w! m* V
转换一下:. [: k8 _. a6 \: o. K! ?
1 N' c$ a3 |4 ` ]1 u
0 E( ? J" z) P9 j0 m8 k3 Q7 L$ n" t# m$ ^7 v- |1 e$ ]( h: l# ^6 O
select b’01110010′
1 J, s; _' {$ ? i; j5 B) H0 P! s6 n! E
/ ~0 n) Z0 w" w1 s5 t
- E1 E4 B: p* e查询结果& N: l/ M- I E" v- Y% |
7 _8 ]9 @$ y2 |$ D ! v$ | d: L6 R' b0 Z+ A
; K; \3 u. H n; X! w. \+————-+ k4 p( F7 T7 J9 b) f
9 a u5 R1 z* M6 ~| b’01110010′ |
+ o( d6 U3 X' r% W' o
% {2 {& a3 }$ Z; u! ?# z* q+————-+
' h$ S; L1 ~& o; m. _ Q: W. \
* M& ?, J8 j: t' K- s| r |/ c1 \9 k8 J/ Y1 e
- L8 W f/ }$ x n. }
+————-+
4 n! R3 G5 v9 M: l7 X$ \6 r6 n- V3 h6 W. C* U5 i
1 row in set (0.00 sec)
$ j- n' i% g: R6 M' P$ L, C4 S1 A& D
1 E8 R8 }3 X1 Y8 \; J$ @; k- N
, X7 |. V- N4 W( I2 B( k这样我们就获得了user()的第一位.其它位依此类推
( ^" G7 g) r# r9 d- C* q' j' o3 R& x; S$ W
|