通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位4 n" V4 J. t2 T6 B1 d( z" j3 R
4 }+ p ?" ^, U1 Z" u8 v) q$ [
8 V7 x1 `; ^5 R3 H% y6 T' i; B0 D: m4 c0 F( J: x; y4 p
下面将以查询mysql数据库当中user()的第一位为例:
/ x0 f9 d- R c5 C! Z) s) J' M, B% l, S0 J( g
5 ~; O7 L; M) U' c5 n
$ S3 E' d+ D: X; o, D+ _ v7 V
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
! h, F+ U! G6 j/ T" n
" p$ J! m! v0 d6 P 2 b/ N F9 L$ m5 w
/ g$ `* ]7 U: w+ `9 ~) E. Z
首先执行如下sql语句:
$ X2 P' n- r* m4 e5 @ Z# V# M* ?$ l* V% g. C9 z
2 u3 s. q) a6 f& k4 f6 m
u8 i8 W2 a9 ~2 t ]
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
# E* _) _( K" m. p, h3 i3 i" o' @: `& V3 k9 m$ K+ Z
8 K3 u$ E* V6 y0 ]$ k3 f& [
; A5 K0 W9 ]9 b: X5 ^( O
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的: p' [# p& c& g/ s1 {
" e5 i7 t% G. l( S+ T
# T+ }' M' k1 w
9 b: P3 ]" W8 _第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1- O/ N/ S& _9 u7 @, K
# R+ E) Z: U+ f5 I* ~4 R
# C# o" L! n1 x, e, j8 H7 }
g' J" x) i$ I* u K/ z3 \0 n
如果运算结果为1,说明第一位为0,不为18 ^9 o5 i5 U% Q& P
( V: k; A$ y6 P. H$ U3 c0 c
2 R9 l* e6 q2 w; ~1 M
3 Y, {$ }- r5 m" g! g% L+ f3 [+ _+————————————–+: ?# Q+ J" B5 O8 q% \
" Y- n# C# L0 z" x8 [5 r
| (ascii((substr(user(),1,1))) >> 7)=0 |' U, H7 b( l; Q1 M# l
/ z7 n* h* \5 H0 q) Q+————————————–+: h( k$ X9 i5 v; [
% R/ U8 R7 u5 x5 F/ S6 D, B
| 1 |3 y; U. \$ H5 G, z' j. n$ d
, a" B- V; O6 x, W b
+————————————–+
5 [+ h, E; Q$ o6 r/ C2 U0 Q0 w: F# o% Y% e+ n" L
1 row in set (0.00 sec)$ C. F4 u0 w$ D# b
) L% x g0 F) P5 e. e1 g这样我们就确定这个8bit的ascii的第一位为0
/ X7 \ I; s$ m0 N9 Y% ^7 m6 n( k( V. b- ~ u) }6 X5 x
l3 d) f) Q" V6 A
0 q- N3 B+ A* K2 a% i- g( Q" p第二次我们来做6次右偏移来确定前两位6 n$ k) ]1 x& T0 M1 l! R
8 l. ]! o- n0 B: t ; F, l! ?$ R* l3 G a
. M4 e& ?8 |& g前两位可能是01或00,即依然可以与0做比较,% Z2 ? o: N& V2 b# \
: b* `5 p% G: q( Mmysql> select (ascii((substr(user(),1,1))) >> 6)=0;8 B9 Y% D( m& ?9 g: g6 u
. R% c# s, _) l' z2 T
+————————————–+
1 @% e5 ^# j: ? H( c# ]3 m; t# m
| (ascii((substr(user(),1,1))) >> 6)=0 |
D K* G) c# v4 ]# _
6 F$ }4 S: ~) Q2 c2 v; T C0 B+————————————–+$ F8 k4 X+ ?. y* x! y# x: n$ \
! r0 n: g$ ~2 G| 0 |3 d8 Y9 p( F" \& b
& D5 m9 [8 W& u# M
+————————————–+: q% n5 f0 U, u3 Y$ Q; U3 D
: e. r0 `. N% E8 e# T0 p& I
1 row in set (0.00 sec)5 d6 Q3 {4 A3 F. l
# U- O! U2 M! p. M3 E
8 {3 o% N6 X2 V; M& @1 c! H }4 O t6 A" L3 P
结果为0,即第二位为1
& A( P y% a: n2 [5 C _! e, z! a2 [3 p ]* u
7 J. L9 I4 S( m' b- E- ?% e" E
2 I: x# y" J$ H! D+ }$ T
开始猜测前三位为010或0111 u8 a& J' ?, p7 R7 Y$ q: N
( W8 B. f1 _2 R0 ], S( ~# r& ?* @
. e( `- H) o2 ~
6 j7 o% |% q- Z! @2 I, i
让我们看看010和011的ascii码是多少
& Q2 t: {( U; t ^$ m" q# H: G' Y; F
7 }: c! c/ ~0 e 2 q7 }0 g* ~6 u: b
# J" ^& P# [* r
分别查询select b’011′ select b’010′
6 S3 _2 R6 W& Q; g' h' _" o: j7 i H3 Y, u, F
; \/ ~3 E% D" w G* _/ U( L% p6 V& B3 `- e$ w" d- S0 E% j
获得结果 010 = 2 011 = 34 V- ~6 N! \6 G" L) i6 j9 K2 }
+ ^- _# m* I4 u/ v8 `
4 r# W/ {2 j% s3 Y. ~$ W8 B. I) r0 P5 z3 b: K% n* q- e
执行如下sql:7 C$ K9 K) ~) Q2 H1 D# Y
/ g0 ~9 n* i9 M8 v
( w; E u& L/ f! w9 c0 B- r
6 K F0 o+ n ]7 I" I4 y) Pmysql> select (ascii((substr(user(),1,1))) >> 5)=2;- ~! ^+ P3 I9 `* l( c3 W
, v4 R4 _1 u+ E" k; |4 x& Q3 s
+————————————–+& s# Q8 q! t i" P! n9 b$ C
) t4 ] T0 F' \) d
| (ascii((substr(user(),1,1))) >> 5)=2 |
% ]7 v) j0 A$ a9 A8 l3 a- X; m0 N/ n0 h; F }& U
+————————————–+
! y" S$ H9 E) e, V t2 o" q6 w# w8 P6 Y7 T9 g5 P8 B
| 0 |$ t+ V6 c" P$ Z) J
& n3 Y" @7 h7 K" o+ T4 T+————————————–+; u: U7 _ _1 w+ B# V
, h( W7 L) N R即前三位不为010,而是011$ X; L% j5 o7 B# [7 X
9 F1 w0 {0 \( c+ y3 ]3 i
" r/ k$ f" f# _2 ]2 _ p$ m1 V: g* P
直到获得最后一位! W) W) i6 T1 U7 z) d
- W, j1 q4 ]1 Z) F& x
: h- O5 P4 O% ^0 [9 B p
# }3 d1 S3 \$ a) k& p
最终结果为:01110010
" P/ @. a3 v/ \1 q2 s1 t% ~$ R! W: Z( Q' r% g! `6 @
% D I: d ]8 S t3 ?. }/ r& m0 {
- S4 a/ q2 Z3 a; l$ I$ ~2 k
转换一下:
6 L0 r0 K8 g/ y% Y# e
4 q( w. Z% H$ L" \ ! w5 D$ v2 C5 N C! Z3 E3 j
; q; z, N9 |6 B A( Y( t* i
select b’01110010′( G3 o* i/ y6 I6 @& q$ ~0 c3 }
1 f, _8 M# q% N1 V0 s # d9 O! i+ K4 `* v* M
/ B. A) `' P1 u) i( H, t
查询结果4 v5 H6 r8 L" K/ J0 U, G& k" \
' h% B# x4 B: j1 I
. L0 J% ]: e( b8 g7 R2 y `2 f
& Z& b" \" n5 w3 H( p: c6 j0 @+————-+
" [5 e6 L" m" l& ~" V/ r# B
3 H% W6 e; F) N' x4 }/ B| b’01110010′ |* ~: X8 Z6 B; F! ~! M
$ H) X1 h' u6 X6 L- U
+————-+
$ x1 F1 j$ F7 Y% s2 D7 s5 R9 H
* S5 l& B- ~! k. N: E& f| r |
6 d& v) Q8 a1 j$ n' V9 Z% c4 z- |8 k
+————-+
$ X2 t" }% e1 {' q& p- W0 g- e; k! P. ~/ k" F% h: h
1 row in set (0.00 sec)
1 w+ e- v* ]/ b9 l+ r' {, m
5 z) X4 H$ `5 v _! v' q
" i' I9 \# U# N
9 @0 h' V3 m$ K& Q @+ A" v, {这样我们就获得了user()的第一位.其它位依此类推& p" S4 j" _8 x
% ]4 b) W, o) J+ P
|