通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位* V) O$ E! z& O1 Q$ E% s* _9 Q
. o8 n4 \1 n3 R: D9 D. L
6 X5 _) Y/ T: H% P/ K( R# a/ ?7 X
0 p8 O& R! u5 F1 C; q+ m0 R9 c' X1 c下面将以查询mysql数据库当中user()的第一位为例:
% A5 N# [" J9 V6 v0 S
( F4 E" Z! q+ w# _, W( V( P
, {) i) G. w+ A3 y! X8 s" k+ F9 C. u. i/ v/ q- \! p% O
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
! t; m5 ~) m, a) l3 b0 A. f P7 |+ G- z& Q6 S! F
, a/ J. m+ ]3 }# |- ^- F
+ T9 i- @5 h6 |; X5 m8 D$ ^, A首先执行如下sql语句:
6 I9 K: R1 R- C7 x4 D1 t1 T; r0 }6 U. Q. R
/ ^; m6 f- ~* E
+ Z7 h4 b0 C+ t. e3 Umysql> select (ascii((substr(user(),1,1))) >> 7)=0; ]0 X7 {! E' L
9 j/ [* i! @* ~' R- ]8 H
- Z9 f1 R( b) h: D2 @8 @7 }* U9 x: F% a0 P$ f( ]+ Y
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的 X: e6 {) V: s& C3 W* T" r) `. J0 N
$ }+ z4 V8 R5 s & L' h+ D/ N% k/ ~+ g
/ u+ u$ F) h2 a/ z* q第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1( F/ R3 i5 w" N! a: W/ @9 y
3 u0 b2 v! ]$ T: n- m 0 D" H8 ^2 } S: ^+ W; @. T
+ T& @( q: h! v' `; R- V; [如果运算结果为1,说明第一位为0,不为1: J" o) @. J+ V0 X# ?
/ F, ?% x" z J }$ Q) ^
; x4 x1 p/ L7 [; F5 N: }0 y" C: p& M7 |7 i
+————————————–+) ^) y# N# w% n
) ^* n! f' v* e+ V" x| (ascii((substr(user(),1,1))) >> 7)=0 | ?& G3 Q, Q: Z# m
* H( n$ g4 V& F) D* z6 m) X+————————————–+2 `1 o/ z7 I$ ?6 [9 H
2 z0 k. p6 q j# G3 b* e
| 1 |# s4 r7 [! w2 X2 `" _# Y
# p5 A& c9 x& Q8 L% y9 I3 R6 Z* l+————————————–+
3 D2 G7 P }) R& Z, V7 O% _7 I" p
$ v5 l5 V. N2 I$ e+ l: K1 row in set (0.00 sec)
3 D. a: K8 t) I6 y/ W2 g6 {* K4 a: w
这样我们就确定这个8bit的ascii的第一位为0
( P+ D; |0 G8 u# M( z3 _
* k4 L0 z6 `% B/ Q
( ^5 G, ^" W, `& |0 u4 ~# D( T
第二次我们来做6次右偏移来确定前两位8 G* i) x2 o$ N1 `2 `1 C9 }1 F
6 A* P1 C5 b* f2 L9 R0 r3 L3 o ' d. L* P5 C: |) N
' L$ ?3 G, N! N1 r4 @8 G前两位可能是01或00,即依然可以与0做比较,; ~* z, _7 L5 P4 `) K) }0 M& c
* [8 w, h) ]2 @/ m5 k$ K1 K6 Kmysql> select (ascii((substr(user(),1,1))) >> 6)=0;
; {7 k# O% u" Y5 }5 m- Z6 c8 Z1 ^4 w- F
+————————————–+0 O% u$ [* t$ \2 M
# c- D. f3 U5 d' A. |8 b8 |
| (ascii((substr(user(),1,1))) >> 6)=0 |
4 ]7 L8 d- ^$ D, I; w% g1 \! Q; a. b* I3 A+ F7 h
+————————————–+6 f. G) P5 _ \4 x( I3 G( U* G
- R" w1 }* z! O" p$ ?" ^8 q) q
| 0 |
% W- R; Q, h- N: Z( u
1 c- ^) P1 `* n$ Z; e4 P+————————————–+' [0 l* L3 k, S+ [) Y+ Z) a. W
: c- N8 Q. l0 `) V9 E1 row in set (0.00 sec) _; `& a& V4 i
/ K# Z. d7 b( ?' Z7 b
7 Y7 D0 M( V: @/ t/ L: t! a8 K( M6 }, | R" V8 F" t8 T! \4 l3 E
结果为0,即第二位为1
' v/ G( a H4 I1 j
7 G- O/ S2 G' S# q! z4 j
4 m: y8 K' d* X5 H( d' E6 h& U/ K; L( n' x& |9 z6 [1 T8 H0 \
开始猜测前三位为010或011
" b4 W& |$ e. N2 {! {! L
( V# N2 A5 V( e
- N7 ]5 \ l7 l/ \
4 q/ z/ a5 Z# p: I6 S- @让我们看看010和011的ascii码是多少' F/ g& P! O5 ~& b9 z
' R9 D# v4 R7 h! {5 ?. J 2 C7 C% s; p0 P
2 {3 r& w/ _3 F) H* X) r) X9 v" g
分别查询select b’011′ select b’010′+ J0 o/ W% z$ K
1 ~0 z8 M; w2 }+ P3 N% l
3 F& j/ \3 l4 J/ W
: I$ G# N# M( j
获得结果 010 = 2 011 = 3& b8 }8 ~1 S$ B5 s! e
5 v, d" s' M. H7 g0 k4 c* K
( K N& f! E4 \# \0 _6 [- `+ J Z2 K
执行如下sql:+ y2 X9 ^. f q
; t* u3 n1 Y7 w4 x1 u% L8 p
4 C. I' o; a) y9 O4 y! D3 J
7 L8 h# W5 |. [0 Y. R# h% W
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;5 |) X. J8 E6 H+ l
9 @& g8 I3 s- O7 d1 ~. I ^+————————————–+% g, a- c) f2 O
5 J; U ?" t+ e1 K; [* ]
| (ascii((substr(user(),1,1))) >> 5)=2 |
( w4 l2 X: |# P- o2 g
1 {9 a6 u$ Y+ f: L. O5 m5 G, Y) K+————————————–+
0 a! J/ x: a1 v: F: ?
. f+ Z5 h, m1 n# R| 0 |& o0 y8 R0 n1 a* x
; G+ f8 G. L6 l' L- v( B* i$ P& `
+————————————–+
0 q U% q# w6 y4 {* Q9 _8 b. Q, b+ ]* e
即前三位不为010,而是011
- ?% ^, ^8 x! p- o5 v% T! J! M9 M3 \" C$ B" z G( f
, s2 T3 j- i+ @: f
! f8 x: p% x4 k6 }( s
直到获得最后一位
4 S2 V8 L7 u/ n0 ^- X9 r2 U4 e' A1 N. I4 {$ X% q9 E! l6 |! _# v* _0 g
, x0 h$ ], c% b! y6 r! r+ x2 p# _. d* y/ ?/ W
最终结果为:01110010
- g; Y, B2 U; G% u4 c* R, a0 W) ^ X: B
6 V, {: H! G3 M. e, }- X
, I6 E) Z. x/ \
转换一下:
2 a8 P% z; S/ {. P- ?7 q* u
* A2 k) H4 U: o% F0 v8 l
4 }' C9 @, v8 _# h3 @
& y$ K! W/ D- H; ]3 v+ x+ kselect b’01110010′
E7 M7 i) I- x/ y" S: T1 |4 ^8 Q) }5 J2 ]" G" A/ K5 h- j9 B
( l D8 M5 C1 G4 @# C1 F& ~' `* ]3 V% |# _) W/ i, y K
查询结果, t2 E1 Y) B6 h! a& \
* e1 L" l' n: W& X. k9 _
8 n8 c! _) D* U+ @% F: s; N$ }
( J- y8 p8 Z* M' q: X t7 n+————-+
4 S" C6 Z2 B" \" E1 v: J- n$ c( M7 T: [2 R( j& c7 p2 z# u
| b’01110010′ |
- A1 H4 A/ X s, f0 R; b$ D! s9 u4 h8 h3 f0 r6 i% O/ t0 D
+————-+/ \% m" @9 Q2 t2 X! _- l: j
/ I" R; A- r9 k$ K* a
| r |3 V, H: R0 V* k! R1 M: m- H6 N
0 a; }0 r$ L; u( b
+————-+, ^& Z/ y( X5 L, `+ f. K s5 A
+ c' H: ^6 P% K1 row in set (0.00 sec)) O+ W1 e' v0 X% Z, E
- I+ J7 |; L, k- b0 b2 a+ t+ z
6 s! Y; h6 A" w2 _9 n0 ?$ p
& `$ e% m/ {9 Z这样我们就获得了user()的第一位.其它位依此类推2 o7 k" `2 U- K
9 s: R% i4 y& B/ @7 h% k |