通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
2 [6 ] P4 Z3 T% ~- n* H5 U
, h( ~$ l( e; N6 ^ : X5 I* i) t" {7 P; j9 K! F0 N
4 Z) s4 v, _, | j+ W7 |7 ?; @下面将以查询mysql数据库当中user()的第一位为例:
( E5 v- q& B( O# ^# b: A9 f6 D- w- F0 D- f: ^& a
7 z1 U0 E6 Q4 R( B. B, I2 `) a! Q" Y9 R* |
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1). F2 |8 B- Z* U
6 \; O7 Q8 G# M# J2 Q ! e7 E& X; _% o* x
# S; D+ M0 J8 b% X a
首先执行如下sql语句:+ A Y$ ?) c: @9 S
# u) ]+ s( G# X+ O1 G0 K( f9 T4 _% p" X 1 n& N$ s6 l6 P
8 X: H+ ]6 j; L" wmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
& J. f' Q" i8 I8 U) B3 I) E3 K9 d: x6 @
4 h6 s& r& b, O+ n+ E* _: W
0 f1 S/ Q6 b% G) D- @8 ~我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
; p* y( b" [- x) E! l1 x: z' Q# H$ O8 d3 t
& V) Y- h# L3 a4 y
1 s( H( O3 v \6 |( J第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为11 m' M& ~" b- U
* D3 {1 A# T, t3 i0 l6 t M
7 ]( @& u& G. }2 N
" O2 ]' P# _/ T& F( Y' ~8 ?$ t
如果运算结果为1,说明第一位为0,不为1
' m2 \; h# T( Q5 `. w$ F A% j; `
$ E1 r% S, T3 f( y# P& f9 n) [9 ]) l
" I" v0 p: L7 Y. F+————————————–+
1 a% L' T' F- Q) O/ I& `: x; M! g6 ]& J* Q2 }2 Z
| (ascii((substr(user(),1,1))) >> 7)=0 |8 [+ ?) A3 N5 C6 q. i2 _% p
2 s* z: @ I. H& R. h' d5 f* w+————————————–+2 y& n% I5 P+ m: Q$ J) t
& x- f+ |5 B/ v" b: A/ O F6 e
| 1 |4 u: U- t- @* d7 G4 Q
x! [& [# O, i2 D+————————————–+0 f- A$ ]! ?; h$ j5 t8 ?
8 M2 u. e! Y/ |: a3 E' T6 l0 ?1 row in set (0.00 sec)
% T1 ~5 W9 I3 Y& |: x
, s% H. P, ]1 v: \1 s这样我们就确定这个8bit的ascii的第一位为0( @! B9 d7 c" W- i# a ^
6 f z( N8 E) \. Y' v / M/ j% `/ P5 J: ^% W2 U
' d& h) u& E" T4 W
第二次我们来做6次右偏移来确定前两位
, ~ {" K1 C; }4 K7 g6 j8 X
) d7 ~' Y& t6 g$ j8 ]$ N0 D ) e3 C( }6 X4 e0 m; V/ {/ l7 M
9 i; H, i2 L5 `( H9 n
前两位可能是01或00,即依然可以与0做比较,
# c/ |- }4 _; V/ g3 I7 b+ O6 H3 t8 x" d4 S' L* e5 Q( H
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;& B. f V$ K1 i. h/ k& q
- i: a' W' q4 H8 M9 ?
+————————————–+
* I% _, N( ^/ ]" f
' T) |+ ^7 o& q2 F, x7 G( M+ S$ I| (ascii((substr(user(),1,1))) >> 6)=0 |7 G; g" E7 U6 O6 N7 [
! A C+ b; H9 H* A0 C+————————————–+" z+ h- z7 q9 F! _9 a% T$ P1 O; G- \# A
- t' @$ n4 ]2 }# k0 y| 0 |" |& @) X# K4 |. U
% |* O/ \' p& N+————————————–+
+ K( {- ^6 y' u( X
& {0 b0 b8 G8 U8 K1 row in set (0.00 sec)
" o2 O+ j. Z1 x) ?9 w) a
6 v$ y/ K( p- m$ x5 L0 _ R% Z+ v2 d! i3 _# I
, w9 L1 R. f% k7 K/ s' c1 H结果为0,即第二位为1
4 w7 u V* X% x" z! _& Y6 Y3 h& b3 u8 c p$ t6 j4 F9 X1 C
& C$ R& j2 ?: w$ V
3 P& q2 v0 d2 V; {
开始猜测前三位为010或011
/ ?+ L! r( q, h0 b
% t/ ^ w- Y- {5 t# B* w6 C- @
, o' ~. b7 J8 x1 Z& K( `6 V2 t# ]: {$ E: h6 l4 T
让我们看看010和011的ascii码是多少: D$ g& r6 C7 d5 x( O5 W
% g5 d( v, u- t6 {1 Y
1 G& l& p( }% U( ]
7 U# G/ h1 t3 w5 Y' B分别查询select b’011′ select b’010′
6 S! M! T- M" S; T, a+ |. P
% _4 [: O2 k$ j% K+ M, u$ Y ' G% a' y$ `' b# Q3 F3 L6 j
; ^" B+ |2 a6 t获得结果 010 = 2 011 = 3
; H: O1 }( j6 S6 [4 c
; v( u3 ^$ `, {! e* O
' e8 B4 D9 C8 {7 J4 h: \# m: f; v: _0 f- E' A3 q
执行如下sql:
$ _6 y0 T& [- U4 C( W; o; i+ I: h* V5 C& l ?* T3 M( n* V
9 \0 j* k- A. D& `! [% [
' H: y6 F; V) lmysql> select (ascii((substr(user(),1,1))) >> 5)=2;
. S4 o1 A/ x* j8 ] Y9 ]/ {. Y2 |
3 H0 |, {, |# P, d( G( x; B+————————————–+$ }+ V5 \: Y/ {/ _* i" ]# w F
- Y+ h/ Y8 ]$ B) J& a K( F
| (ascii((substr(user(),1,1))) >> 5)=2 |3 r6 H) J" Q/ p6 S/ S
' W0 j9 g; c# M1 [( M# Y7 J# t
+————————————–+! l/ i8 g8 [- a, o/ f$ `9 C9 G
$ Z/ [! G; ~; _/ T9 Z( j
| 0 |/ N2 G, e/ a; s$ {
# D+ X4 u& b' F: i+————————————–+
G. s( Q" t1 k6 _+ c8 ]# T: V7 f( z( b" F) [
即前三位不为010,而是011( N4 f4 L% Y+ s8 |& ^3 h9 H
, c+ n3 z1 f5 V+ L4 R3 ^/ o4 N
: k& Y0 } U- W5 g$ m% A q
( J- j; g7 `7 H! T& o
直到获得最后一位
* Z- I% N- H. h; X8 N9 F( D6 p& Q3 u D0 J3 T" w0 |1 c% f% e
& K6 ?9 j( l- j, q& Y; K8 H
5 O/ p( X5 q d+ a9 ]: {( `( p最终结果为:01110010+ e7 {! t+ h6 P5 w$ ]
0 H! e) y/ p d
7 C$ }; q0 e6 B
" G$ b+ s+ t. {0 G; Y转换一下:& H) y f4 Y% z& ~
2 b( Q) f1 {* n; i( F: _2 I: k
! a M1 @3 S, C3 c6 V) U0 N: t+ s- W3 _" o+ A
select b’01110010′
# `) H4 Y3 u+ k6 ?* Q) @' V" Y% ?" _. k- G1 Z" O* y; g/ T
9 v, I$ @1 x% c1 K+ j
9 T1 p- T2 i4 m3 Z% n查询结果
( V; I- |% U; B8 |+ X9 {0 Y% C7 l. ^
* P8 {' k1 V5 M6 _2 |, X9 l
& K% h' U( n0 O* F. \9 t( H: t, Y; x7 |( [ D0 }
+————-+( P6 S! G. h; o5 d% e
8 y8 C# O F; d8 N) v
| b’01110010′ |
, E+ M+ Z) ]% E; V- H3 j7 C
+ q; i( }6 o3 N" E. ]* I( `9 Z$ U3 I8 }+————-+
+ j2 |" |# }- Q0 m* n1 q% a% Q$ P! J' x6 G% z* ? \# |7 n0 u
| r | s& n+ q3 l# o; ~3 _/ r
4 T, P. m: N( X9 Q' F, c
+————-+
9 J- G! U' l9 K8 j0 g1 e0 D* m4 e. K) z7 ~6 Y4 P- t8 i
1 row in set (0.00 sec)
9 j, i& G& w& Y, r8 n2 J, P0 N/ S$ r& c7 f1 j6 \& [
% i: K5 t1 M# O( Y6 {
( n: B' V0 e- W' L5 k这样我们就获得了user()的第一位.其它位依此类推3 ]( I% C+ s* s9 g
/ `) {' K' ?# E6 A |