通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
9 p1 H/ ^2 E4 T* m
! i: ~3 p1 @8 {; x : M/ g( b- x1 U* g! V0 w
: j; `5 y! O2 [9 o( Z# F4 m, q下面将以查询mysql数据库当中user()的第一位为例: H* }3 W6 c0 ], w7 i/ ^& M& z
5 A( [0 ^0 t8 E( q9 P- H- o) K& Q
v! [; \/ u0 }& x" G
" @% D$ S! S8 M$ H/ Y8 E: o
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)/ n0 b1 ~3 C- G* s4 y. H
) w) l6 q4 S& s5 Y& p/ d/ _
+ N" B, h; [$ }7 {! }, v! E: c% m3 `; b! k! L
首先执行如下sql语句:0 E. T% e7 \0 R7 e7 P( G. E
c2 }- h1 z+ B6 Z! H% e2 R' [3 z9 g
" v6 A9 z1 }3 [0 ~5 Q% i0 n$ O+ b3 E6 z k9 [! |
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
+ u: w% I3 I) E, o, x5 J# v2 J) x; I
9 s- ?5 T# I( `. L8 R6 H4 n
) o$ r& s) m/ r, g: v! K我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的, g$ b! p6 \. U
5 y$ M5 j- W: r' \0 R
* b& R$ [7 o: S8 S/ z5 v0 O! P0 X( u* b
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
, a0 Q- v$ h$ J% g. n, I' h7 B; ]; i$ f6 f) Y. s& p, i9 Q
6 N; ?0 z, B% x4 c2 b4 F2 G1 g( Z) z
如果运算结果为1,说明第一位为0,不为1! k5 i) A1 j) n5 \9 P
$ x7 s; Q* |. T# y. I$ m
& j( c& E- l5 e6 r
& }- _$ f' G2 i) { g0 b+————————————–+
; n% _+ G$ g: Z; Z
& }: x2 e/ Z R| (ascii((substr(user(),1,1))) >> 7)=0 |
$ M4 W# c3 a- X6 h/ z' J' ]+ B+ J% V4 P
+————————————–+9 J8 s+ _( K7 o8 G/ W7 V
2 S( E% \: T0 P, G+ ?
| 1 |$ G, `" h; f5 ~
- l+ v- S; I% I2 K4 D
+————————————–+
, j9 ^" ]! K! p( V, z. a
. \: l, f# t9 v ]1 K1 row in set (0.00 sec)
4 ]8 E4 x# s( s' c# W
$ t$ ~0 l) G/ \$ q* }* {0 g# X这样我们就确定这个8bit的ascii的第一位为0
; Z# A! L V$ D! m0 H; b* b" E
' L! I- t1 ^* \0 \# x 3 R, y6 T$ E. s; M3 [4 \* [# V/ W
2 [% l {8 U- w& S8 t4 ]
第二次我们来做6次右偏移来确定前两位
; j5 _" q8 X) M5 I' L6 k8 H) Z3 k
- a! ?& K4 D0 Z0 z* v6 ?: B- c) ?
6 }( ]/ x# h: M7 m# @3 f& @8 y+ V1 \9 |9 M+ @% m" F
前两位可能是01或00,即依然可以与0做比较,
4 Y* k* n6 x$ i; m" G3 o H3 @ G5 g! B; a, E
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;" |+ A8 S- Z% Q5 o3 E+ Z4 Z: }
' F& a: M- T/ v+————————————–+1 j8 x/ G5 \0 k" k' k. F
" Q0 T; M, i: v% o7 e( h& H. e
| (ascii((substr(user(),1,1))) >> 6)=0 |
' c0 q& u1 m2 K' [
# F& ~' q1 q& e) H0 Z2 h% e+————————————–+
" v6 ^" V$ ?! U* j: r- a, m
: r3 S5 D" j8 a, i' p| 0 |% c' M' O) D' [6 u6 _( q" n+ @
7 @' B, i9 k" A5 }. i. S
+————————————–+9 I) l6 R3 T3 d8 C
% ]0 I& E5 Q6 C u% `1 row in set (0.00 sec)
- e8 K# W* c9 b M8 X
. L5 u* ^: F R
8 l p" v1 ~# s; n* `1 o+ a
: Q8 m. A5 G5 l5 }- N" V. {结果为0,即第二位为1
: h: m4 ]- L- @. o2 X' a8 y
. N9 x% K$ x- L2 w) V
+ _# H) S8 g* S% p, Y7 f: K" P2 h# {; p$ X: @7 \
开始猜测前三位为010或011* X4 p, C {, I1 }" {
A* [4 o: z% x$ g
+ C4 c$ c7 `6 I5 c& C! f8 @3 L0 E# K, u0 o
让我们看看010和011的ascii码是多少& X" u$ ^* { S! ~* Y
% N: t7 V( h6 c
0 j- h ]/ T. B7 b
; C3 h) Z/ y( p/ z5 {# L) o分别查询select b’011′ select b’010′. _1 `( ]! ]3 c- ? |5 {1 R
" `! t" u+ N/ x0 P' q s: A
6 |3 x5 q( y$ W ^6 G
& t1 s* e3 J# F* Z3 c1 ?获得结果 010 = 2 011 = 3
w6 g' r; E* ?- S; S0 `+ c2 X; j- X) h4 j+ Z
' }6 l+ i/ Z F8 I7 {0 G2 @' P# {6 \7 z1 i1 K: g
执行如下sql:- @- |5 F; k7 r/ u
7 z/ A- V' x- U* M
# x+ P3 ~, s0 M; W$ x2 k/ K v. l9 \: C: y
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;* v( ^6 v% S& [
" L) h8 L5 }% a# C9 h( _+ B+————————————–++ Z% v, N' h+ B+ C; }/ P* _- {
) J0 U7 n' B# v8 M3 V0 e( p. k; y| (ascii((substr(user(),1,1))) >> 5)=2 |
( r& `9 P" d- w/ @; d5 f1 |" Y! s' g1 L
+————————————–+
1 [2 j& b* p9 _; C- {# ?' K6 ?
( l7 \4 m( }/ W4 ^| 0 |, B- l) |/ c1 l7 H3 v
, D. p: @+ c7 z0 u: b7 ~
+————————————–+% `. m' ^1 s t/ b" Y* U
+ ]3 w8 U8 _" O: _1 ?6 V5 {7 }即前三位不为010,而是011
3 x% V# ?& D B! F2 r
+ Y" X J6 z& K2 a! ~
$ C& L* H }; Q# l" `& w# r2 b" c" r4 y# t! ]" b9 ]4 _
直到获得最后一位7 R1 F2 d& e {/ D- f* m$ Q
9 c/ q( ~/ A& S8 e
: {* u& z6 b1 w" S! U7 U! G; l) f$ P
最终结果为:011100105 C; l+ i" ^3 K9 X/ G: S4 `
" Z9 W6 Y7 ^- B
3 \8 p# p8 C- p5 b
9 f7 z& U4 @. X
转换一下:, u' q' a& I& A0 O {0 h
4 U+ C6 }! G- _
( f2 U( U a. s, \/ ]% S' A# |) ]. o
select b’01110010′$ @4 p3 F& |0 }( ?8 t
7 ^0 @6 M# `/ L4 N- M : y0 B E% {' A& j( b3 f" G; [4 h
- V4 X( |$ d' A
查询结果
. ~/ I. N. u2 M1 i1 b8 q/ R3 j; S( K5 g
% J0 P( G9 O9 d! l+ F- T
: v" Z+ }/ B0 u4 k4 n+————-+
8 c8 {3 I: J9 r/ n% {; Q
! X5 ?5 z+ I6 Z( @8 [, Q| b’01110010′ |
% Y' O! z( H- }& h% z. P. [: e2 s7 u3 A# }
+————-+
9 j9 f/ M; I# Y5 `; l+ e$ D. G0 x4 h0 f
| r |
9 h! R/ G, h/ j/ L
4 X$ |- i5 Z( W9 j# Y4 z4 C+————-+6 s; ~3 B/ v; c' z8 @0 p4 q
6 z7 f& e7 f! S0 Y9 W6 y- f1 row in set (0.00 sec)0 F. p& F7 E T9 v$ e( ~
4 Q9 u5 u/ ]7 B7 M
4 z/ O$ _1 y& x7 b- d4 B
* C8 d9 p# l9 c这样我们就获得了user()的第一位.其它位依此类推
- f# a) A; F2 D$ b4 ~/ l" K
, K0 q+ e% {6 c |