通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位% w9 t9 e5 V' t. z0 W9 z
, Z: B- N! h6 O
A+ A3 K0 {4 G. Y# j7 x; _; m1 c
3 w% J& ?+ ]+ Q& O" k! w& Y下面将以查询mysql数据库当中user()的第一位为例:
5 v$ e& w2 y8 U4 y, h# ~! W( x2 }7 M# B, ^/ d3 l7 p9 X
0 Q' l O0 y9 g6 g8 G/ g3 G2 S" @( A
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1). }- v3 C, c$ Y" o9 {
- W, ^3 K k* ^9 n( |; w: }! T
! t: |1 N% y! k/ P: g& I8 j
+ n1 {( |" j$ n8 X) [* T; {首先执行如下sql语句:" B, ?$ f8 ^( r R* ^/ q, v
; i3 Z# s8 u9 O2 p# Z: C4 T* W" g7 [6 `
3 j; U: R9 u8 Y0 h% `( \# y
b* O# f6 g* _& K/ T- N- l
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;/ V9 Q2 l4 O9 L
/ D& k/ d" T/ h! l
8 W0 g. u. ]- h2 K. Q
/ E6 ~- F+ F, k3 P( c; k$ o我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的: `# F9 V; J) n6 Q% K! s& b, {" l
D& k$ R+ @1 _* ~ `- b; G' B A2 J4 i: w: V3 m( I
% t \$ l) j# q/ R- S3 s3 }第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
2 P1 w$ F" c) ?8 M5 s
, }! V; G& o/ `8 g. n5 \$ l 8 D2 S# f4 c4 ?7 \/ }: [) ]
' |- ?+ i/ H9 w如果运算结果为1,说明第一位为0,不为1
& X& y) U" g" U; Y+ ~! p' ]: |- P x9 { W* A
" ?6 ^- o5 x/ A% m+ o# ]7 ]
X l3 P) T" s1 i/ F+————————————–+
& x! t* u. y8 p+ X) H2 y% X, V
; |) O" Z$ [ q* z! E| (ascii((substr(user(),1,1))) >> 7)=0 |
1 B9 L K' S6 F/ F0 {) a3 e+ E* V' x# J2 w
+————————————–+
- F5 h% H; C8 V5 c5 f- u6 k5 f% k
| 1 |! |9 i+ y- {1 H
$ b# J' T" W/ O% L" ^
+————————————–+
! l3 R" c" D x: @+ B0 N
0 s6 i$ g. _3 X3 N7 D7 k1 v1 row in set (0.00 sec): j) C: w6 _( k
, f6 f* q4 }% ?. j+ G0 x这样我们就确定这个8bit的ascii的第一位为0
- K1 y. g6 l6 y. S" J4 D) A) f8 n. O) Y% \
V: R$ Z0 e A5 S, Q7 c# C
6 N7 g ]4 v' M8 Y! C第二次我们来做6次右偏移来确定前两位8 S9 z) y' D I p, Z6 D
* G- t# `' } p" o9 u! f & [7 H! O% p+ b+ K% Y
. h! H4 n1 W! n T4 k
前两位可能是01或00,即依然可以与0做比较,4 [" ?$ s9 }" s9 H
7 y/ y. i `: L, @' Ymysql> select (ascii((substr(user(),1,1))) >> 6)=0;
; S! M5 o8 D% h% `8 K
) m( s/ d2 x( w/ c$ a; Y+————————————–+
$ F$ p3 J; }; d, \ _1 v0 N2 x4 \+ c+ T$ W& N% k5 a& r4 G
| (ascii((substr(user(),1,1))) >> 6)=0 |
0 C6 ~$ n/ D2 g2 \* t Y9 d& T4 k
+————————————–+
. G" e' n: \! k. b; R
9 c F5 {0 l- w a5 o| 0 |6 Z; U: m! b* N. V9 Y
/ a" t% m# }- R" V
+————————————–+, P, g% ~9 n+ m) d5 Q
% U1 N# P) F9 K6 A4 f* P
1 row in set (0.00 sec)
# r. r. ~, k% w+ B2 [' M! _$ v3 T, O% p3 j, [/ X1 J; g8 t
! O3 _# L+ V* R$ }! x
2 \1 p9 d; ^5 t% w' G
结果为0,即第二位为1# w' j8 [& `7 X3 a0 `& _2 y
! @) w* u- W' e + ?0 l& {! M6 F( w/ f( |8 c
1 |6 b$ ]- e1 S0 m$ F开始猜测前三位为010或011
0 {, e3 n. c& [; t1 L9 y
6 g) K) f8 h; F, h
; n, U, ~2 b6 _" P- s& e. G* Y, o4 y$ n4 F; Z @8 e
让我们看看010和011的ascii码是多少# {- o' L3 u& D9 x" I
; s$ b% U/ n! G4 w5 |( ^3 O
% g7 t( Q8 H5 e' A- ^& v$ G
* \. m! m: q0 C+ H" j分别查询select b’011′ select b’010′
' I2 }; w3 V/ s) H( g6 a- G& U, x5 n3 t& ~' |2 o) M' G
% ?3 N7 V! k% L, p+ j% ~
4 I& Q+ L7 H1 x. T# a获得结果 010 = 2 011 = 3
; Q5 y- p! A1 g: i' f. l- n, P9 T; s6 d8 }" h3 u( ^4 p4 ^ a
( c6 H4 a z$ D* w" s
- B- K6 t& i" \执行如下sql:$ @* Q0 V% A. a, E
|+ H5 C1 \ b b) ?# G( a* y
; k* ?, F' d' _6 ~) H% w7 c5 k8 w8 L& l( E2 w4 s/ M# X/ W
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;( A. L3 X: G% f1 A8 d
- b- D' ^2 F) `3 Q9 y" V4 m+————————————–+) S/ J3 N7 f& J8 L
7 K' K1 @- ]8 h4 u7 S! V8 X7 k5 g
| (ascii((substr(user(),1,1))) >> 5)=2 |
0 d& P; }& t; G5 ^/ T- h2 u/ o0 N2 C$ {! q' q& y
+————————————–+
! w& ]- l" O3 o' V# U
* \! v0 |, n/ Y+ |6 t2 r0 [| 0 |& _0 ]3 t* V$ v, u( B7 E! r
4 C) z& p6 g) g! A9 \0 x* R
+————————————–+
4 B' W( b \, p2 |7 P& p
0 ~; L; Y$ C* ?% v即前三位不为010,而是011
1 G% q. T: r. O; d0 d7 b3 A$ u9 M" S" j) B; d
4 z5 ~& h- o4 `) H
+ V7 n8 u) n9 |) ?直到获得最后一位 N. z/ H+ r% U. h
4 u! S0 [9 C W/ \# c
$ B" Q3 z( Y2 X+ @; t
3 ^3 Z0 b X9 H) E5 V' {8 S
最终结果为:01110010
+ l, J8 X% N T+ }! d: O. n q E4 i" W4 j/ [- h" I4 @
* Y" C- P6 x. y9 k. O7 B4 ^5 d
1 Y5 B C: v/ O8 U! N+ Z
转换一下:, ] p: d3 C* p# {5 b8 `
3 ~! C( Q% X2 ~% T, h
. P) u5 x! p/ M( c: ?, f
7 K0 M7 E0 V7 k/ I s2 }
select b’01110010′% c# W. `! ?" J8 t2 M
& W$ B" ?% Y( T4 c 8 q2 i8 m$ _' n; {
/ s9 Q( W8 r a ~; g5 M
查询结果
( t% {2 v4 |6 p2 @; K3 ]* y3 e
& k& e P7 j( }/ ?( P4 p6 J
- B; h H: F% {9 R% x6 G4 O* ~0 O' y. S' G8 V1 ^3 d6 \
+————-+
. I# Y% ~$ ?1 l1 v" D) e# }7 {8 a* ~ D9 Z! l# }' d
| b’01110010′ |! i2 d, I( e1 M6 x
6 C( M; {* ^4 X% k+ p3 l. @+————-+: I" T2 d" K; @
0 d6 f7 V& N. V9 y8 X
| r |+ N3 d* L* F M8 h0 l. N
# _+ Y# ^+ Z- |3 l
+————-+
# A' B5 H) Q- I. r" n3 `. D" i# R/ M3 _: S
1 row in set (0.00 sec): G' D; X! t# J* h% ?
; s1 _2 C& o$ M8 c( }9 s% J
6 c+ m3 ]4 F% V# d) C% d+ D, e U
* l6 e( x4 T" c! B4 s. F这样我们就获得了user()的第一位.其它位依此类推
: F& ?% n. K3 @+ B0 {
+ ]' m: I- Z; L5 z( N# E |