通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位" m1 }% E" w# x4 l
2 @ p b0 S6 ]& \0 D- X
1 c6 R+ R3 N0 S' m3 j
& G' g9 I# V5 D+ G下面将以查询mysql数据库当中user()的第一位为例:- j' B* E3 Z' l5 b$ ^( l
, p M0 r& O6 P4 J: {1 M: X( ?
& a G4 j3 }* G2 A$ M+ K7 F
( d1 [5 }% l2 s V4 X" Yps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
& z' W, O X4 d
* u" Z* @: c, G( f. s2 M' |2 F
5 ^ ?$ a1 b5 e. Q& Q% @5 R4 x& W/ ?8 Z/ u. A" D
首先执行如下sql语句:
/ L( k" b9 a" ~, G6 K/ b( D
* a3 B% I3 J5 [- [ . S% T |* [+ C5 H
7 n& D) w8 H3 D, h
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
7 }4 A& w9 |5 R( ~
9 g4 H) u) H" }3 i& M ; S3 C, h- C3 j7 z" g
1 ` t- V- F7 {) H: V我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
6 G+ I+ k' M: m9 t6 h! H! h4 q# {: r8 e
/ ~1 }5 F0 B& J: ~6 r2 p$ F
7 o3 C; K' a& X% j) x2 i) {
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
7 V; n$ |% ^+ x7 t! f" t/ ^, g/ j! v
2 F( I! @7 n* o- F. D # b+ p* `- S. |# r, {, p/ n
% S4 S4 S" R9 v: h9 e5 P2 j& |如果运算结果为1,说明第一位为0,不为1* W8 t1 U: C: F- k; ^9 P8 C$ a
* u7 S5 Z# K' f# f" T1 Q
7 ` B% F- b# P$ D8 z$ t! `9 R
! o9 f( T( M. r( N2 \$ H" R2 Y$ v# }
+————————————–+
2 n5 M- Z+ Q/ m4 f: z' x. T& K1 b& f0 M( S/ j
| (ascii((substr(user(),1,1))) >> 7)=0 |! @7 l! C9 P. Y& N" X
: s7 L2 _6 H2 n7 ^+————————————–+
+ _) ~% ~6 f# N$ N j2 c- N/ l& k
| 1 |
9 S+ K& z/ V1 _3 w" i, n0 Q- n
6 d* g# M: @0 {+————————————–+) `7 b0 [1 A8 s, T9 Y3 ]* m
u% j2 Z! l) i5 Q0 y/ q1 row in set (0.00 sec)
# ?2 f# y- c% S# t% Y( b& L# d! b: [4 \+ Y8 W# Y8 o9 n
这样我们就确定这个8bit的ascii的第一位为0
$ T5 t2 V I; Q) S* p4 x1 W' k% d. G- L4 }: b
7 |) o1 `$ z9 x0 U/ `! S) r- m: R1 T1 ^0 D d# Z7 r; ?& ]
第二次我们来做6次右偏移来确定前两位
( |' V0 C/ V* w( K8 {0 V5 [& h7 M" t+ Y1 ?3 w+ o I% T
3 T8 k- K5 W/ u' y6 y. h2 y: u
, o! U5 M7 J1 M: {. _+ ]( \前两位可能是01或00,即依然可以与0做比较,
& K: _7 t* A) m9 `5 f# B+ \* h- T* F9 I, j0 d2 ?
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;5 V' [+ q$ Y1 X1 v# h
' C+ ^4 S. L' l2 P) h
+————————————–+; L( A+ o2 L6 I$ [: l2 c, M8 }
; k; O# \: r) R2 q3 L7 X
| (ascii((substr(user(),1,1))) >> 6)=0 |
; Q% Y, ^+ p# N* L
1 R6 \4 m Q/ V+————————————–+
; o0 x' B- h- v8 e4 Z# v4 H' [' p* k! C: k9 ]
| 0 |
1 a, f# S6 b9 d& H+ k2 U$ n* U0 |3 L7 H+ S. f* }1 S& Q% Z
+————————————–+
2 u$ `2 ~$ C& J3 v% Y$ ]" J
' R' \1 O$ a% U, ?( }( u1 row in set (0.00 sec)
9 R# E3 y9 m9 j0 n c7 @
- b* N2 U/ }& @( K- f
$ n( x5 Z' A0 [8 Q
8 {4 D8 i/ W. L( D结果为0,即第二位为1
8 r, w* [; B: t3 T& {& | X
0 D8 d. T. G- ^. G& U
( O# @6 J- x& o; a2 T) r5 v
5 V1 S! B, I+ a' N& Y3 @开始猜测前三位为010或011
" S- g" z6 H3 N. C. y$ \$ l0 W- I$ z0 b) \; N7 w; i0 e, y' f- n
. o6 x( v9 b) d- J6 y
6 W( F; d8 E' q: ?( \4 l让我们看看010和011的ascii码是多少
) `. N. u5 Y' A- F- e' Q, o+ W: n+ c) |0 |. ]: o* P- y
0 l ` x, d5 H0 ^, ^3 K4 H
9 w; U' I' C$ a ^. a: w分别查询select b’011′ select b’010′1 L K3 A, |6 m1 \: M
% n( M) @3 _% w1 Z* _
5 {. K s7 ?- Z9 M! G3 {2 X" ~5 ~& X2 Q P* `
获得结果 010 = 2 011 = 39 ^% ?1 L! x& W/ \# V: k% L) u
4 J# e, B+ i! e: ^7 B9 V
' e8 L( D/ @0 o2 N$ }% r! u) F2 u- N9 ~0 C) z# o0 X) n
执行如下sql:
6 d3 P, |' l' y4 B, k, n6 m8 e$ n
! L5 T. h' s7 l! ]7 j4 `
7 S1 \5 m2 A; K! W# s( M C5 q3 R
0 B6 b: D$ n& C; Q( \& `mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
& n+ E: r- A8 b# r9 I8 f9 S/ J4 t; V7 I2 n: F& i, |* K2 \
+————————————–+
9 s5 y0 X4 j- D" }5 R7 b- \
; F) t& I! G# G4 C( f| (ascii((substr(user(),1,1))) >> 5)=2 |
2 ~7 B$ G# [+ I8 g3 ?* ~' O% ]) b
8 m$ o @' n4 @5 Y) Y( T/ T+————————————–+& q' g: L" l' Z: u- I: h, g& l
, j! T' J# y1 g/ F4 F
| 0 |
- b: _& J2 i) X" I3 s9 a/ _5 q
: S3 r, B% b- M. N% c3 w+————————————–+8 C: W& A2 X' W( F3 b
; o8 a; I$ Q. ^, A ?
即前三位不为010,而是011
% l0 J" W5 d# _& L& b' \, e8 m: V- Y% C! ]+ b+ J$ D L
' o+ z& s9 f S$ {8 \6 N5 X5 V
1 f8 Z$ ^: V3 w" y
直到获得最后一位: m: W. X+ k* v8 v
, `/ M+ D4 q3 y% ^; [# d- |6 g
& v, s9 G+ j4 H+ `/ G. y2 Q$ o' q0 a; t
最终结果为:011100102 ~( _" [8 k: ~' S
! ?& s. W8 S7 w% i5 `9 R
, v: j5 c3 u- B: c+ ?% `
5 L1 ?3 _* X8 M0 \' c转换一下:
+ a* g$ y. _& C& x% _! w2 p( B' D' H6 y2 y6 j
: S# K# n4 w) {/ [4 F; e$ b' o$ b! [: E M8 I$ p
select b’01110010′
' o+ @5 T% Z- ?2 ~9 l$ F
, L, @; b) b' B
6 r- B' U$ X& ` K3 ^' Z+ @ e T' ?' p& k" x% y
查询结果
7 [, [, R# S" S* J( B! O
3 F- U3 ? Q; ]: ~" H$ j* \
: S. u( `5 Z; c4 w1 j9 k( E7 X( x v+ j
+————-+' C5 ~1 u/ S, Y
1 T6 T ?: n" Y: }| b’01110010′ |0 @& s/ ]: x7 i; [ N: Y) [
# h, w0 w4 I2 u) W0 P7 x4 ?
+————-+% D- b T/ L' {# S
! F, C6 Q/ U, b, h5 O3 ^7 |+ i
| r |! N, p, I5 p% }8 ]3 B% H
7 K' U" [/ G0 ~% E3 B+————-+
% }6 G8 ?' ^# m$ t6 C! O- \; s
; V4 y; t) A7 m) g1 row in set (0.00 sec)
6 o$ B6 G) R3 V1 ]$ a1 v: u/ `, k$ H1 k& A' Q
) ?! c# |- v E5 }. l! O
# @; z: V! s6 r- ~ \5 {这样我们就获得了user()的第一位.其它位依此类推
5 U5 I- `3 y2 g f% ], a
9 {4 W7 e+ O& l) P' C/ X* d8 I |