通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
0 }5 D# [- c/ v: ?1 \
+ S/ K/ p5 [0 ?$ t$ p7 `8 m2 Q7 `2 f , s5 C0 Y1 F0 R2 r+ h2 o2 S
% L4 ?0 D* F) T9 i5 H
下面将以查询mysql数据库当中user()的第一位为例:
1 W, e* {) N; }, o V% d# F
+ ^$ \ F4 X5 O: [, q 7 q: [$ ]' d6 q: g
9 y5 J8 X+ k. D# Z
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1) z8 l, k; f; [! }
, C2 K0 |. q% B4 I- P
3 d. f/ _1 @4 A. K4 @+ C9 x3 z" ]' D; I0 a7 A) r$ W
首先执行如下sql语句:1 A q& K5 p: g7 B# ?* X
; q- J2 n6 v+ S- B9 F. g
4 z! c6 O( A$ p' Y
4 p; q( k9 O- U1 U9 Tmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
; M% r3 i& O) ?8 v. ?5 h S# F) j
" I( v3 V3 S1 s* ]4 R+ |5 T( r
. z; q) ]' C3 _# H2 ~8 [2 K* h. t
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的( `3 t% @% N- S1 } E. r O
2 w# H' T& ?! ?$ N5 p p2 U & {) p) B# W6 p8 U7 ^2 F9 I
' n9 `9 W: ?, D第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1/ y+ w8 z, Q# z4 L4 m8 F/ n
7 w% p, g S# Z$ F2 `' e
! ^1 b& F1 }2 ^ F% u
& {3 h/ }5 i' R6 Z6 ^ v如果运算结果为1,说明第一位为0,不为1
# K% o1 o* O! U( b. j+ A
$ h: p( ~. j/ ?( T* X. ]' G 9 h! P4 D9 f; i9 P
0 n5 Y D; h P1 ^
+————————————–+# T% Y" `/ Y% x) b- `& ? w
1 ]7 y/ `# s8 q/ M| (ascii((substr(user(),1,1))) >> 7)=0 |$ g6 Q4 t! U2 }
; K4 ?6 _, [1 G8 @5 \+ R+————————————–+
; d% Z+ d( b) y8 f' x& A% p n1 a" W/ j5 D+ `
| 1 |
% w5 n0 |3 b$ F3 w0 W$ C. i
7 c+ c- r! U) j5 e7 r+————————————–+
( {/ B) q! ~6 B9 {0 q/ k! I" z( `! O" p+ B( p& i6 _ ^: ~- o( Y( [
1 row in set (0.00 sec)$ u7 D7 t( v9 B: D
6 S) S! |4 a' X这样我们就确定这个8bit的ascii的第一位为0- S% y# u" k% V
8 V+ e- ?: G/ W$ \
; B2 b$ R ^% `* \3 G% \7 V
. N2 w) T' Z& L( \' b
第二次我们来做6次右偏移来确定前两位! f- d2 [, Z0 n$ W1 x
8 i! r7 P6 @# P/ o# G4 b
# Z4 s$ f! n o
/ l5 j- G% X# R, z1 q( `/ E前两位可能是01或00,即依然可以与0做比较,& Q6 M4 v2 S& g! E- B3 Q
, a1 I! `9 r) i; ?3 p+ Vmysql> select (ascii((substr(user(),1,1))) >> 6)=0;. O3 ^+ ^- ?+ t4 {
B) }7 P# e4 c) g1 q* M+————————————–+* T3 Y1 {' ]3 z/ F* c6 L$ c2 t
9 [' ~( }6 c6 @7 D| (ascii((substr(user(),1,1))) >> 6)=0 |- Z* d2 b1 l; }: w0 E
" v x0 E# a+ z$ E2 r+————————————–+
' L6 b) g9 O. b% _4 i D" c# k/ p' O `4 r! V
| 0 |$ h3 f d1 \4 ~ K$ Q
- R* e! y- _/ |$ b9 I/ v+ O
+————————————–+0 U0 A: N+ M5 }2 R- U6 v1 c
9 j" N) U7 g/ n+ G- b5 q/ r
1 row in set (0.00 sec)
" t: k5 q' T2 E! A9 ]! c: G
0 t6 j% _) w- ?1 I) ~' \# l / h7 v8 t9 e4 @- j8 U- {
( H5 o0 h) Q, z2 ^2 B结果为0,即第二位为1
% U$ k/ ~, }7 c4 k6 q& W! \# v9 V$ X# n: O
1 f+ O) y5 Q3 A% Y$ c) W `/ R; b9 O/ c$ j9 [2 S# j' j
开始猜测前三位为010或011
5 n. q/ K2 z2 L# V0 g/ I
' e" g, @' B6 z+ r% V % k: k! w2 E' H5 [
) q9 A6 b2 I( a# v) J7 ^, R( [: W让我们看看010和011的ascii码是多少# N, S4 o# J& r' u) r v8 \
; Z3 l e8 ? [/ N5 x! ]& [' ?
, C# l% b4 r5 Y3 v( N9 R
% w8 k5 b* G$ ^2 x分别查询select b’011′ select b’010′
& E* I2 w- {5 d( g8 X* A9 K e8 c. @
. f" g2 h9 R0 {* Q
4 Y# S. S. h1 T6 G( K; y7 M& ?2 |; Q
获得结果 010 = 2 011 = 32 s5 D, j: D, T- Y; K
5 h4 k- F2 u- v3 B# J, n ]
, s1 K5 ~5 \& ]0 ~% G7 K
+ P; u8 G& O, ]8 o3 Y
执行如下sql:
/ e2 I+ x |- T
& M) t$ q) A. U5 x9 ^
* U$ q5 R! f1 D" E
1 F& g& K9 O6 u- A4 smysql> select (ascii((substr(user(),1,1))) >> 5)=2;
5 f; T6 d! w9 o! R9 }( ~
& N8 T, S; P0 ^! ` D0 `; j+————————————–+7 C" p b4 n" m7 i, [( V) p
1 G- N5 X; Y' w9 n8 C8 l) x3 f| (ascii((substr(user(),1,1))) >> 5)=2 |7 X! v, ? P0 ~* k: z- c
6 ^/ p6 T6 s2 k
+————————————–+
, P" P, ?- D0 L6 C5 {. `$ a) F2 t6 M* V8 W% l# h# w6 z
| 0 |5 `2 Z: h& Q' m" P
2 f3 j$ h) U! q5 p+ L* n$ K, t) u
+————————————–+
4 Y) M F1 K! d9 ^, Y& v. O+ u; k
即前三位不为010,而是0119 y. ~- F: w+ H. q# `
+ X5 Y# {8 x2 e7 O
5 \# K8 `) s5 F3 N6 v# o1 Z
J! N6 h" W/ e- p0 O+ N' `3 q直到获得最后一位
G; h* V* t1 g: m3 @! U2 u) ]% X( w( \/ D) |5 y% {1 e
+ k: T( ~1 D0 g* X0 K" P' X
1 f2 ]* [2 I! d最终结果为:01110010
. W9 {; m0 T1 L6 W4 v6 }, y& x4 \9 }6 t* z" Z: @+ c& u
- z1 z/ l1 d6 O, m: @1 L
7 N5 z. I' _4 X; ?- {/ `- B转换一下:7 h f: h1 {- p5 z k
' U8 D; B c; [1 b, E- y/ _
4 I9 [5 U- O' [# f# Z
$ [8 {' K9 Q" z+ g8 rselect b’01110010′7 @6 K# [1 j0 T+ u; T
6 L7 m+ m+ N/ ^- ?
. w9 X$ u7 N! n( ~! Y: y9 F ~ k/ d1 s- j
查询结果6 ~6 k9 \+ G4 }* w. n- g
5 J) Y- ?/ }8 K
0 I0 `8 i' p0 T6 J
. V; O8 |$ F: s$ i8 m; p+————-+) p2 I/ h, O3 j: C6 q
$ {6 w) v9 j* X8 g! o% Z( N+ e3 l
| b’01110010′ |
$ E# ^. w+ f+ ^1 q$ r4 m0 M+ `8 w- D: U/ a
+————-+
, z2 b8 y% h, Y/ u$ k9 Z' G5 W: P$ C0 c
| r |
. |, H C3 Y7 G* h7 g6 Z4 b0 Z4 j8 R6 s/ X2 B0 l
+————-+5 h" R3 t- S7 H. O1 S" s+ i
' A3 o& O9 G. S* f8 [0 j% k1 row in set (0.00 sec)
" X2 U( a) w8 F6 F: W+ A( G' q' n) r3 u. x
9 l1 n# B! ^6 C7 y# H1 p5 r
% b7 b. J) I2 d8 U6 @2 b' D这样我们就获得了user()的第一位.其它位依此类推& k7 o! F, A0 ~' n1 g* l
. s/ m7 Z& f7 A$ ^* Y |