通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
' S7 i7 B& o. r* O9 M* Q# `0 p4 \+ H) q5 w3 X
5 j+ j+ ]& @; M8 M
0 ~+ a, `( |4 Q8 A. ^
下面将以查询mysql数据库当中user()的第一位为例:
" S9 \, O0 U6 A1 h0 Q; d# U; ]3 S+ a( u" X6 o
1 S+ ^- c1 d* X
3 `- Z6 l6 k1 @7 D' zps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
$ N" Z) ~% n# S) y4 o0 p2 C4 x6 X7 X, O1 n6 ]/ c7 P
" Z/ I3 f6 P) c* Y
6 p' N- S; X' Z( e0 |+ F" l首先执行如下sql语句:0 v7 ~9 l8 E$ m: |
8 k8 N( ] d: }$ t O6 S5 B& U/ T& v3 c: `6 }7 ]
. Z! B J9 x L% rmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
* \) F3 I5 ?( d. |- J# a9 ?# D% P
/ H% J" a+ O9 c3 O9 I) ] 2 e7 r8 U* x; |
8 H6 J4 }6 [% C3 t! a! V0 O- u
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
$ c# m7 z& q# V2 l2 X
- q' U7 k9 v. F# m5 O7 z / k3 O. `/ v0 t/ F/ S/ d0 H
0 c" Z7 n1 J1 A' Z, E
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为11 I0 s; k" J; N! ]" R
& J8 m. `) O, x1 C# j* m) G
" E# u. g( A8 v! N% @7 U. ?, ]9 G
2 t! m3 F, U. {" Z如果运算结果为1,说明第一位为0,不为1
: b2 P* P) @) X1 [7 ]' \ P3 g+ ]' c& s, d, Z- y7 h
& Z, g# l- o2 f0 k5 t- @$ W
8 |* u& {& C) d& ~" p+————————————–+
4 h8 ^6 m: J% s& O& J
1 w( G5 Z1 B, Y* @| (ascii((substr(user(),1,1))) >> 7)=0 |- i+ {3 @/ A Z5 }) T
: `+ Q" q- p0 `( O0 s- S/ C4 M+————————————–+( R+ r8 Y0 f. b+ ]1 ?3 F
W/ s9 Z" d- o) W( V1 b1 m
| 1 |0 a% W8 h$ {; _6 j6 K$ K
1 G0 P6 U- K# a/ j( Y, G s& o+————————————–+
) N+ d" m* x) Y/ B+ }$ t9 C/ l
# j( l' x. D% N, x8 _1 row in set (0.00 sec)7 ]! z A% ^1 A/ d" N
3 f# X" `) w' w8 y9 ^) S这样我们就确定这个8bit的ascii的第一位为0+ n3 g% H- h/ K% S2 R/ I! m
( ~) V% u6 o! m$ m& r. g, W
9 \/ k) |2 W) W2 N$ [1 j# |) ^; `0 `* I( u
第二次我们来做6次右偏移来确定前两位
# A+ k! y: ? Q+ o* W
, I- X9 [' G, i% E' I( C
5 n& y9 r/ R, U( O
: [, ^* c6 @9 ]! p5 v- J! e前两位可能是01或00,即依然可以与0做比较,
' U- _1 r/ v' D5 g& @: |+ ?, A |+ J5 [9 @- u
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
0 ]/ c' d3 B2 n
6 G L, e, V4 ?9 W! Y+————————————–+
% V K2 P+ a# e: I, n; i0 V( ]/ u. v7 ?% I2 V
| (ascii((substr(user(),1,1))) >> 6)=0 | Z4 L ~4 K* C) V
, K' f( y& U1 w% ~! L9 M9 x; x
+————————————–+% [$ r C( b/ S, @* d
- l9 S$ Z0 m; D7 g
| 0 |
* W2 t8 b! N, q1 U, C
- Z( v* _/ ^0 ~+ D. l; ]. a% q+————————————–+: ^$ W; P, e8 Y. w
. m; n" { l3 O: p0 S4 s1 row in set (0.00 sec)
2 n" |" W T. f2 N d0 P
, P0 p6 ^7 Y0 D$ z1 \" y
2 t- @6 X' u+ z/ f, t2 {2 H( a0 S8 z
$ S! y! Z: ?; l2 T/ y# V. M4 n" a结果为0,即第二位为1
6 H2 p! s' M' k; B1 B6 s2 O# V5 J- q4 Y+ ~
M5 a8 h4 f- w& z4 f! \* ~
& O, _5 B, `& k3 g" d
开始猜测前三位为010或0110 W/ Z9 W6 A, f" A& v; w+ r
0 o e: z/ q, R4 z, _/ g% z
" m5 C# U% E: X
# m% c& x1 F, M$ n* b/ X }
让我们看看010和011的ascii码是多少
% ], G& e0 M0 W6 v$ j6 M/ {5 E2 g# n) t3 v
- y1 P5 }, T6 O r' r/ z! b
! e+ z7 a5 _2 \, w+ Z
分别查询select b’011′ select b’010′8 U" M7 ]5 G% d3 d) E7 { m- L$ M
5 L+ |% a9 ?$ T: K9 w " e: k/ U/ b9 t. q" N
$ U( ~2 G. v' h8 v( p获得结果 010 = 2 011 = 3# l# B4 C4 O2 ^7 k. s2 y
' o# ]5 A4 Z- t; G0 }3 l2 d
}. W" y j- }+ [4 |. @
. D, a1 g0 j+ a# g2 L1 Y3 Q执行如下sql:( Y" U: r' Z+ F) P( N- a4 B/ g
, }9 z5 e0 f S. Y& [( s% l: l5 f % i% p) E& t: O# D1 M
# v2 q' a- G" U. L6 A' cmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
- m# D; {7 Y5 T; w8 u7 F4 G8 a0 M: e' C; @5 R6 J- J
+————————————–+
; S, m9 ]4 F. V7 L i1 T. \7 w# n3 ?" J0 F* G( E
| (ascii((substr(user(),1,1))) >> 5)=2 |8 B4 S6 @$ _; L+ x! j# ~" V' C8 a
( ]* [% F5 _8 z% a( G3 }& w0 J/ ~
+————————————–+
3 r3 o8 Z& \$ I6 |* [9 V1 B! `& W
| 0 |
; T0 |$ A7 p! q: t4 `
) K8 K, F7 R+ n0 B8 h7 \+————————————–+2 e0 a/ u) @" D# s. z. e5 h
8 |4 D# e+ l- v6 U" M# `' n
即前三位不为010,而是011) [4 @) B! G% s
0 A2 U* j9 U4 ?- t( d9 b) v/ U; U Z
% _/ r# W- w8 \, | c8 G4 g: y3 A# }6 x/ y; n1 t) N, H
直到获得最后一位6 I P7 h- h/ b) z
2 J, B v0 ?; [5 z) U3 p
2 _) C6 T. x9 s. ] ` v- A
5 O H2 \6 R& m5 y% t最终结果为:01110010# W' L# D: l4 s! R& T
" @5 U2 I$ b4 X) B
$ ?3 [8 N5 a V$ m* X- ~4 p
' `" r) \+ L5 C+ g' x! G转换一下:; `. w9 I3 n9 j' S
3 }5 Z6 W3 l. C, f
' B4 H" Y8 ]7 v( F
6 E2 v z6 R/ L; t% E1 x' ^0 _. p
select b’01110010′" O2 N8 p7 \* w
$ I8 o* `4 w3 [
2 v$ T9 I/ y/ r( z
- j! F1 Y4 h3 r) I! L查询结果
/ U# L: G4 Y* s! n) Z2 r4 T* t- p& h( E# A
4 h% H" W: [0 C& w0 [: e, L3 P ]0 _; L% ]; P8 N/ B; X: w
+————-+$ N5 t/ j5 S2 K9 ~+ s1 t
; k5 }# a& H9 \& K| b’01110010′ |2 S3 S& H# s0 G& l8 i1 d- z
/ k. I" U7 K' z, l+ S# ^- O! z+————-+0 j, g4 c/ }$ x1 C
% V; r; A( C* E+ z9 ?| r |
" e k* P9 w' S2 S+ V5 w3 R8 g6 \
+————-+' _/ V, r( w. e
) w. n& y) I0 z& m9 G- q
1 row in set (0.00 sec)
7 o( k$ d% r) s# J7 {0 e! [& \! G& V0 u5 r! O8 i$ @' \0 S( H. a
' W; T, m1 g% a/ T* P. G. u q( h1 ~( S7 d& m
这样我们就获得了user()的第一位.其它位依此类推
' ^) ]; B: f' c( ?9 L" r* | f) h6 H, l7 F* F
|