通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
0 {, S, z* X# h5 p% F0 n. M/ V5 ?
1 r& R* D! I% j( P. K* y! D7 r
9 t: ~; U/ | L; x* ]0 |* Y下面将以查询mysql数据库当中user()的第一位为例:+ K h4 f# H# v* O0 g9 V7 O
# |3 R7 b9 n! j' O4 c
8 q/ L! p( y* S& ^- X
7 i2 K# K7 o3 Z* v) Q9 a2 Q; Y4 vps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
4 H0 G# ?* i1 v! l; }! J" D
) C0 q8 w( F9 T+ t& h; G 3 W# L: [- X' @$ K0 s. D5 {& F
6 q3 \- D5 b: I4 ?& k; z
首先执行如下sql语句:6 D7 R# `- c' P6 P/ j6 p2 z
, C2 {& f" f! h, H; O, j( o
- e2 w& p+ l* T6 {& A/ v' \
5 a: b/ J) X# O. Fmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
: n8 ^0 [$ ^% w0 u; x8 D5 `% X" Y; t( Q) W) @
S, E# {& L% P
( g0 W1 W6 g+ J: _, }1 G8 R" j* U我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
1 z- F8 X3 d7 ~/ @- {! J
. F: c: l! I |* v. ~ & N8 M" C" }- a9 A3 s. l
& F9 w: a4 s" l: B8 V第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1: `# s" z1 G \! N
8 x. V8 d: B; n! V( O; v, O
; V" ~7 x u8 N; X3 L9 X
7 J( v4 n2 T! y" N9 Y D如果运算结果为1,说明第一位为0,不为15 U# l% S/ v+ [3 V6 R% [0 d& h) Q
* Y+ O7 ]8 h M
6 c3 |' g( @5 t. e. d# `
! b. O: z7 y) j+————————————–+% N. L4 w) e" W" B* x; Q: ~
: D9 E: D: w% e! f; @3 R2 k/ [9 {
| (ascii((substr(user(),1,1))) >> 7)=0 |
, D0 K; I q9 h' u+ \0 t* _ J& _7 f+ \* j) A6 f" E; H! V
+————————————–+
/ \: p: N% {: d. [3 i( {& g5 D! h+ d# [0 V. R* x
| 1 |
7 U6 K* }5 L. d4 j2 H7 d0 L9 S' C% P8 j+ |) K
+————————————–++ _" @/ D; E+ q( ]
# ^2 K! g6 U: G: s* n+ ?1 row in set (0.00 sec)
; D# `) R) W4 n4 [2 f
, T/ ] I( H; @# L/ t$ ~这样我们就确定这个8bit的ascii的第一位为0
" k( d# r7 I+ Z
% v" `% n' V0 H/ s7 `; @7 P* ^2 u# S ; u& E( p( X" ]4 W
( S0 b1 L: y* z9 N5 J/ S第二次我们来做6次右偏移来确定前两位
& q! }: f9 A4 [, D& e0 D6 w% o3 X5 P, j" G; `7 ^
) }$ J' S1 w3 n
, f6 D, g4 ]! H1 q) V) a前两位可能是01或00,即依然可以与0做比较,5 n: ?' e- q# q" g! a
: B7 y3 u- z V9 @7 G |mysql> select (ascii((substr(user(),1,1))) >> 6)=0;; t, |! P! U8 b2 Z8 ]$ I3 V
) i3 M+ t/ K* {/ x, l/ ]$ h# _
+————————————–+- y- d2 o5 q4 Y. A) i% E
( N; l" \5 u* Y% C' R5 x( Z( R| (ascii((substr(user(),1,1))) >> 6)=0 |* m' `3 z8 B; I; I6 `
! C+ b, `2 g, J/ m, f) W* I! e* o+————————————–+2 z1 L# r. O+ L2 z
/ h2 I% O& M# e0 k| 0 |
' C# X, q5 c( y
! ]4 o! V4 O! h! a+————————————–+" r; q$ V5 l! k# a! |
- N1 K' s# a ?1 row in set (0.00 sec)
% K. P5 E; W4 T2 J. R0 @4 W, S1 P+ s8 w' X- Y& ^( y; E Z
3 H7 D6 E+ a/ h+ G5 ^
* A# c$ ?$ v. a* b! ~8 T$ n2 g2 X结果为0,即第二位为1' y# P# `8 {) T) I; j6 \. X/ ?
* B4 f6 N# u. y7 ?4 ?7 c6 T ( K0 q! o2 w5 D. I
5 V2 ?, C( S! J" ~% R1 W
开始猜测前三位为010或011
/ x X: E5 i) J2 w- x, ^+ Z9 i% E. U4 Q' `6 ~+ F1 l
5 _# n$ O) @/ H: v
t' a% H& ]' o8 ^- q让我们看看010和011的ascii码是多少8 ~+ q( P/ B7 v8 j
: K. }$ s0 a; I( a- D
- c0 S& o) Q6 y5 X: [/ A' e% g5 T& T' D2 L4 V, w
分别查询select b’011′ select b’010′
1 i: R0 W# S8 n( y7 j% `* |3 |# d6 D
' o' r* t( t5 Y4 k: m
4 d$ B: v2 E n9 P1 t, {获得结果 010 = 2 011 = 3( s7 k' i& Y4 K& i5 x/ ~4 r% G
+ g- k/ G; U/ S. M9 s% Z
, x* q, X" D0 u+ J. W
$ X% o0 p2 H1 l+ V( h执行如下sql:9 |5 D" W# q0 ]( z# G) v% r" H
1 {9 T6 s6 E/ H2 I) |2 m
, N$ c8 }! ] m! h _8 o
/ F8 S2 \# @9 l2 H2 C$ x* l: zmysql> select (ascii((substr(user(),1,1))) >> 5)=2;. y4 b2 y+ M: X8 ?; i. B- S8 T
" k: Y; ^" A" O6 G: M& j+————————————–+
y* U: `" p# B$ j8 A- g9 { o+ y" J. @( t: m. v8 D& a
| (ascii((substr(user(),1,1))) >> 5)=2 |
: d) u$ u5 l7 F4 W+ j* L
9 L: l3 _( r6 W7 z2 ?4 h' V+————————————–+
1 D" Q: M& h0 w$ O2 _
# K4 m8 a: ?6 F4 z$ c/ Q. N C3 _* b| 0 |: e+ N5 [% @+ s8 Y6 W: Y1 I
' e8 t S1 G0 A$ s# v$ J+————————————–+
4 t! U( N" A# c% W4 y2 \0 [; O
) o& H) ]4 r% l& D9 i6 Z7 s( o6 ?即前三位不为010,而是011
7 B1 M# n/ [% R
1 A# o: R" D; {
, R4 a5 v: j9 A# c. \" X! j/ q6 y- V. { v n( p
直到获得最后一位
+ x5 i3 @) k4 L; }( t
; ~5 t9 o9 s6 N7 |6 t2 V 5 k+ _ T# K6 ?7 |9 U
- s" {; Q O. u2 `6 y最终结果为:011100109 y+ Y5 e5 \ V U$ d
0 w4 `7 g. u7 E4 T" ~' q. |- a
9 E0 o/ X9 o6 p2 m6 |( \
) n. j- ?& F8 |& @& Q% s) a# V/ h转换一下:$ ?/ b9 H8 l+ [
5 a( _% F" S2 F ?3 A
! D3 R6 o! ]# F2 ?, o
; K4 \; D9 x7 D2 d: T. Mselect b’01110010′+ J" _: G3 O" ]4 N6 r& c* o
\0 e* m. u# C* b* t1 S/ K
1 Y! U) Z9 r2 _
; [3 o# a0 Z" v6 g8 w, [
查询结果6 A8 G+ v+ y0 o8 ]
/ g$ c7 s/ T% q- O+ X
1 T, W; Z0 a2 K4 c0 H. p' H3 i+ D T3 [ o. w# Q
+————-+6 e6 r1 z* K& b) B* a" n
/ B& g$ {. S( N& Y
| b’01110010′ |
+ Y4 P* ~, Z, V1 U& U* r) @6 t, y$ m: C4 @8 D$ D! Z7 d
+————-+: c5 u/ S1 _+ V
& S. C8 `. A' i" U, y% G| r |
& D# e5 I y8 F$ m* W- K2 e) R! y. C; |% A6 {6 o) Y: Z k
+————-+
; d# ^7 ?- Q/ n( b2 L. f1 x+ Z7 X- \: e5 T
1 row in set (0.00 sec)5 A& c, Q# t# I6 ]7 ?
2 Y; A3 I {# B; k8 o) M
8 [( _( z7 ^; i: Q8 v5 C4 H: @, a
9 k' n$ X) B/ n4 W; t
这样我们就获得了user()的第一位.其它位依此类推 q9 L( C1 \7 r; S
( T, c1 h e7 M/ a |