通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
/ C8 |: n% g9 `; N7 K' M$ v) w& o' Q. Y4 N: m
( @) r8 O% `; d! _5 i% I$ p6 ~4 }6 Y- H1 h: y8 r( z9 z
下面将以查询mysql数据库当中user()的第一位为例:. T9 o+ C& H& x! q
: w/ e6 L- E9 A8 E2 l
, @# E* ?$ b0 t5 D. B0 c4 ?' E$ ^, m/ n. f/ t# J
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1), s- ~( ~8 m) Z+ w+ y
: z2 C* k0 O& O- m
3 O, S6 B- R. a2 t3 S: |1 i6 E' G0 ]$ y
首先执行如下sql语句:4 X# R8 r! a* a6 {3 k' k( m r
5 O$ w" \7 H) E
! {+ ]; `4 F* C, ?1 d( U5 b4 O
, y c, y. @& O9 D; z# C$ P/ \$ Tmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
6 o% }- P0 Z m0 i. Z1 [0 g- N: q w& L7 O0 R1 K7 L1 E
( P6 [( B8 t5 G# v5 F3 t! r
! R, H- {' [, {; ?
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
, V3 P- h. v* L* _
; i1 l7 i: S0 @ - @7 ?8 G7 w: o4 R9 @
, `; J5 J! w! d& A1 B: A
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
$ ]2 Y, k5 u" X& q& g6 u6 a: g( V9 Z8 e% A* R7 f7 k* y
R: T! i+ u* l$ W& ?, ~) z- F& ] U) R2 G1 [1 A% a
如果运算结果为1,说明第一位为0,不为1' l& E0 O& F" w. u5 k. n
% Z7 L: G+ X0 g) M, u; Z
6 v) s8 Q' N% l4 U4 e7 j9 Z0 O9 O5 A! |; m- H, ^
+————————————–+
% n* l5 K8 o. u; x
8 L, v2 q4 N p/ }| (ascii((substr(user(),1,1))) >> 7)=0 |; x1 Q+ U9 f1 ^5 Y R+ `! O
) l2 P- y" M6 k1 d7 c
+————————————–+& }" H/ }) f7 C5 F. p7 s1 e' m L
3 \2 m; p) C' V
| 1 |
S# u* {9 n, v# D) @6 J: {$ {1 x* A) C! ^
+————————————–+
5 E! t6 t+ s0 ]8 ^& r% H. l- W- Q! t# R
1 row in set (0.00 sec)
. u2 @$ X7 N6 `2 v# ?( p. l0 b5 N% Q7 l- l W: M
这样我们就确定这个8bit的ascii的第一位为0
( d' o V2 y9 k# u* O. M
' J, ]# J2 p0 o: u8 e ]( V" e# _9 R
g' ^" q, c1 b" k% R: `1 s, J) z
( v/ e- }; g9 g) _% r* ^第二次我们来做6次右偏移来确定前两位, U* Y9 B$ I& e9 c+ A1 R4 P
# y6 e6 _$ T) ]1 d6 v- D
' H8 I( U }6 a5 }, ?
6 M1 p& q3 o( m& e9 E! P1 w前两位可能是01或00,即依然可以与0做比较,1 _% k: t! O! _% L
2 H% e- t- f0 u9 mmysql> select (ascii((substr(user(),1,1))) >> 6)=0;
8 V& N0 ]- _/ t+ F+ r8 Y2 ?- k9 [; u. J* _* h. g
+————————————–+2 \& X0 r: l7 y7 L" u+ C
8 [6 \3 V0 v4 \5 I2 ~; ]/ C
| (ascii((substr(user(),1,1))) >> 6)=0 |
1 U- k9 {* u! C+ J) }
/ C* ?" Q* h% e1 F; l3 ~9 O+————————————–+, G$ ~; `# h! s0 d3 Y
4 }( b; L2 q" c6 [1 V! w$ J| 0 |
6 f8 D; l# y7 M/ i! S9 \6 p/ k
+ \0 \% f) k; U$ z# Q6 B+————————————–+
# S7 \( z; g z2 \: z
2 |5 Y. B5 C) |/ O& b" Q/ O1 row in set (0.00 sec) g; S) ?3 ^* G0 F" @2 Q
1 Z% [6 O, W) p 2 N' L7 ^% w9 X3 |/ ?* P
6 a7 d" t, d/ h: n( y! d: k结果为0,即第二位为1
C. B4 {- Q% H9 ?- _2 ], k9 L) |$ o; T% Q
% j9 n4 k7 f; C
w& w3 D0 g4 b: G+ n5 B开始猜测前三位为010或0110 m& w+ E! D7 X- x
# O- N! E/ r% \. | $ t2 O. q6 A3 }/ ?4 G; r
. Z5 K b- n6 u/ {9 G
让我们看看010和011的ascii码是多少6 F1 H6 [$ f1 ]- R+ c! M8 N( x
" J5 o, A- ]5 Y8 Q' O. V$ y! k : a' B3 E2 H- w/ C# N0 p9 X& [
2 v2 `8 z+ W+ P# b8 k" w分别查询select b’011′ select b’010′
$ b. I* j$ e6 v, A4 a! z W9 g- X. y4 ?6 X2 C
8 |; z$ A5 R4 R" O. k, X- `+ i3 S, F. H. `2 {
获得结果 010 = 2 011 = 3
, T; ?+ M. m+ ?# `& w1 _# g; A: |& I! j
, m2 ? W1 s) w+ {# R# l- Z
4 R" z. j7 |& W' O# s执行如下sql:
' ?+ G9 y$ t: z6 P
6 w4 K1 s( a/ G % X* H6 M( @. [7 x6 }6 b
! \: P$ ^# P5 r2 J- smysql> select (ascii((substr(user(),1,1))) >> 5)=2;
$ [+ f9 L" D- `( [& q/ }- x0 x/ C* ]: J2 _
+————————————–+
& z5 ]9 {8 p4 R+ _" C: d1 ~) y, V0 ~+ T
| (ascii((substr(user(),1,1))) >> 5)=2 |* } r4 \' U8 `- }
% t4 }) S5 Y7 g" K
+————————————–+$ J! k5 O e. ~
8 Z: K" O6 S" H1 E3 x; c. V! {7 C| 0 |+ J% }8 }9 T1 G8 o# E" n- U
% t7 c; K( H- [0 d+ H
+————————————–+& i) m& R6 T+ m6 k( A
- g: @1 t* S" i8 v即前三位不为010,而是011. r6 j" v& S. ?" {4 V1 {
) G; V# i7 L9 U+ x) i' m$ G3 j
1 z$ Y% ^" l1 E4 v1 J6 @ _: O. M* J- v) d
直到获得最后一位
, [/ @6 a3 k0 @9 |$ O8 q" Y& D( T+ p
, }$ c ?$ d7 {. F8 G0 Q/ x& B# s$ P) K/ f6 z6 S+ J3 f
最终结果为:01110010$ B! F3 u0 S* e* F
3 i) ]2 ?* ~' `/ u- T
; F3 z' n( k7 D3 g- l5 k. c
, {, o* Q' ]/ X% ?9 U转换一下:+ ` W/ g% t& {# r$ o% g
0 C3 J4 I* p" c * S8 |3 t* ^8 ^+ r
- l0 X; [. ~# Y2 T' @select b’01110010′
, u* F; n6 Z2 Y$ e/ l' b
1 I6 j) r1 j8 f2 y$ r" c6 z7 ]4 w5 O 6 U q. s; s5 O
' u3 H2 z6 B. o( r+ _- O! m
查询结果# c0 J- ] M5 J J, r0 @( s
R" l* T( J0 h% v3 q) H6 T& ^
- n( k2 a8 m- F+ f. w! _, Z0 \- `- r5 O" {' W# ~4 y. v& |# Y
+————-+
8 t2 Z8 V) c# |" J; d: R7 [3 e5 x
3 c# u+ X# \0 B- m| b’01110010′ |( R5 s2 T- C. F; [' n; R2 q. u
8 P; k; ~+ W* M) w |% T2 m% p
+————-+
4 \9 i8 T! z! ]! ?3 q$ A% \. }7 m, f7 C8 t8 ~& a
| r |- F6 |9 M/ m/ p7 c2 ~0 W
+ |$ t d, E* M# i4 @. M- L) o' x
+————-+
; a0 q. O1 O, A$ d" M/ Q$ p7 p( y' N) J) m# N
1 row in set (0.00 sec)
8 C0 K3 t) b! _- K4 C
6 K/ P. \% W0 B U; \! N 0 u3 D4 f9 p; p3 k$ O6 S8 D
* ~: v8 m0 h" J& J, y3 R4 u
这样我们就获得了user()的第一位.其它位依此类推
9 R$ N- ~4 G$ z+ q
( q1 i3 N7 s z+ a. M |