通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
/ D8 Z) ?1 z, x( _" f4 |3 b- c: _/ @: W
_2 {5 |3 J# t" P
# }+ [7 V# B p; }; p下面将以查询mysql数据库当中user()的第一位为例:
0 o- X+ {1 V/ {( @- o" P, Z
$ ?% w( [2 b, T$ _* `5 {% O' ^# U 7 _9 R; e* C4 Q: j" {% B
2 n7 M3 V: q6 i. v: x) G8 V& Z y
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
) Z O/ i9 W6 k3 m, l4 [- v q3 z+ F2 z. S0 d) `5 ]/ i
3 F$ L2 ~3 L3 Q3 e/ M: W' r+ @' U) \
首先执行如下sql语句:
* u0 \# E |. @8 a K' G% f
3 e- y8 t5 t" z$ \! k. ]; I* w9 p 9 y+ [+ h% l; W
: i7 Y% m4 M$ t( pmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
% N0 E+ e5 w" _5 Q/ n" c5 i' i) z y' {9 |# f/ [8 a
1 y7 {5 ^# f# e& B( \8 y I/ J4 C4 b# P
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的
6 q, x) ]& U' q1 p0 [( S) k- U+ Y, r
7 F6 f( n G3 U7 T# M5 x
& d+ F* K0 P: B. D; J! E& S第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
: p! E( Y; H+ @5 H' k5 `! p
3 G# S, \6 U# g) [( Z3 l
$ c/ ^1 x' w% n; S- }: c- X- e+ ^+ Y0 ]) ]# w9 V, Z
如果运算结果为1,说明第一位为0,不为11 s( a5 ^6 L: ^0 o5 |, t
& E% L+ F' {7 s& r8 Y L a/ x' O
1 K1 X4 M* k+ h/ Y2 g+ d: a4 @+ S2 F- ?$ Q) \1 T: j" l0 j
+————————————–+% ~6 A m4 b7 k8 E( U* ^- Q
7 z9 Z! N q6 D' Y
| (ascii((substr(user(),1,1))) >> 7)=0 |
1 q4 ]3 _$ h) T. c5 q0 e P
! u7 I8 T. F f- n3 _1 K+————————————–+
0 ]- \9 y! ^# p9 f# c: P* K
. |5 N( h# j$ W) D| 1 |
# U+ K; ^% P7 F E. v/ i, r" }- q1 v2 ]( c+ ?* i
+————————————–++ x; V2 p9 b$ D Y" I, `6 A
+ F2 L2 t* d5 K% j+ x$ [% q1 row in set (0.00 sec)
1 w% X* i; t; X$ W; P1 y) O7 S$ K j, }6 Z n* {
这样我们就确定这个8bit的ascii的第一位为0
- d ?; L0 T7 Y+ n ~, q* E% N( I* L3 Y* D" N) D' X/ g
# x8 V( v* i$ V) t) S
; ]4 \; X9 E0 |& O第二次我们来做6次右偏移来确定前两位
k" J1 H6 L- R* s' m- R) ?; _. a# s; H; n; X
( Y& ~0 |8 z5 S. Y& ~, {+ I
~& N7 ~4 ?+ ~ h3 L6 P前两位可能是01或00,即依然可以与0做比较,) y# } ~) O, S& W; |& }
! h% B: h+ y$ S+ o
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
3 d3 o% ]9 g3 e5 v; j- ]7 x7 U6 ^ w
+————————————–+
$ c9 G- o$ a' ]9 G$ W, a; j3 V0 g2 w4 o5 V
| (ascii((substr(user(),1,1))) >> 6)=0 |
4 t, P+ ?" W3 }; `2 {1 Q9 G& W! \
0 g; B+ _3 b6 p- r+ J' A+————————————–+
% D. b @0 G7 f# u* ^. a' U0 B( ^; \, Z
| 0 |5 R0 h' Y! j5 t G3 e) f0 p
2 F* A$ X- \: M; ~* }0 \9 ?9 Q- R
+————————————–+5 W$ q) h3 [! f" ]- L9 m# b
4 [+ ^7 T3 w5 d2 w1 row in set (0.00 sec)
+ a b: I" l: e& E& w, h1 O! f& |( Y# b7 @
( {; R0 e0 w. Z3 j Y5 J, W+ S
8 Q, z# o9 T( v0 F6 Z结果为0,即第二位为1" k. \( N4 C3 r$ u
; l* e7 u& e6 v6 o) x
" g0 K! r- v |" z6 b
1 `2 K0 o) B; D/ h2 R% m2 j开始猜测前三位为010或0111 K) Z1 t1 X+ _. e. F; t1 q
# a. ?; w. b+ |
# Q2 i& W) Q7 q3 s2 w8 R2 b% D/ K
X& h- w1 s: |6 p4 M% ]让我们看看010和011的ascii码是多少
8 n* S8 T4 i2 |) ?8 j K) s
0 K g7 @+ v- i/ H' {4 w
5 u7 ]7 z1 J6 e0 Y$ _! F
& N. h: i, H/ _. U, K/ K! @, w分别查询select b’011′ select b’010′( k5 f5 A# q1 n, t$ V V
) `; T! D; i5 Q; F) z4 M7 j $ l+ w$ Q% m! `7 u6 i1 j ^
! f/ e2 b4 W6 a( b/ G. J& y. P5 ~获得结果 010 = 2 011 = 37 e" l# m; B8 ^. f+ s# A
% [* U9 f6 {6 i
! a" P# \6 O/ ]. B S# v' s( A1 B- m( R5 a( S' L
执行如下sql:! F0 m4 e! Y. Y* O# W: y1 m
5 u0 D; z7 y1 v0 q! n% s1 ?
" t4 u: d2 ]1 T0 i/ f# R
& ^( J7 `* y# M7 ?3 e- u$ xmysql> select (ascii((substr(user(),1,1))) >> 5)=2;/ D5 @. p. n/ Q6 S$ R: a( Z
e$ ]0 G$ P( {1 \# ~1 Z+————————————–+
& I8 R& P& j. {8 r7 {
, f& o* P+ }1 Q- ]| (ascii((substr(user(),1,1))) >> 5)=2 |0 Y4 q" G0 a, d( c
( V& X" j% P' Y$ j! {3 V
+————————————–+
; X% k6 q: n& s8 B" f. }6 Q
$ b0 z- _- u* f1 J% A/ j| 0 |
; M: |; q2 i5 D# l0 L5 P" H; j0 w: H& t# v9 W
+————————————–+
/ V# L; }7 a+ B$ N& S$ t1 I
& p5 ]4 a/ O5 \# @: {即前三位不为010,而是0112 s( c k3 X6 h Z
& L4 U1 a" `, @3 z6 v$ z5 b" J " e! Q9 Y) {1 Y9 q3 K( q8 P
9 O6 R, c$ `- z) B% G" R g直到获得最后一位: h* e% l: {2 p% b' [. G) W
7 N3 p% t( [! j. m+ L0 f
+ i$ g8 a9 I. a: F6 }0 F/ p
4 v; E7 ^8 E5 G
最终结果为:01110010
" A6 H4 X N0 ^! o9 O" F3 R
8 G/ v. m4 D( {/ w( l
4 j4 Q0 d3 r/ z% s) T4 Q' j5 U) f* [
转换一下:
0 a! t% x4 {2 v& D) i/ Y8 h( ?9 V
8 Z7 A& Y4 ^7 ^7 t: d: X( @
, w% C6 I. r1 X" Y4 l9 c; A: Y S% Y) T% J2 a
select b’01110010′
i4 x8 H( R# K" }) R% I, S' F# r2 M) E9 f, c% R; q
4 _# v, I* B1 c; x
1 |6 N/ R+ c$ B- ?3 v
查询结果
. E5 T0 k9 J, y& ~* Z
9 B; E* }- g$ N( v2 o
! V/ ?/ L( J9 i2 P
, X. m! U: Y6 s( d6 t+————-+
# ]+ v2 e# r8 ^- V" ?& k
& Z/ j% D o# ?0 l, g| b’01110010′ |
8 [0 L3 W) r1 }: N3 G7 m5 d; v0 b
2 U8 v" r Q: _/ [$ \/ ~+————-+
! ?+ o7 G7 z% N
7 y: E2 h. c3 b0 C3 i| r |+ o" @ r5 z. L E5 I! K# V/ D) w
$ U3 u f1 ]% N( ?) ~8 [5 k
+————-+* P. d3 {9 B7 |( P! x, D
; S. Q1 e e9 I3 g1 row in set (0.00 sec)% R3 Q9 o$ K1 N' o
4 x& ^9 J9 T0 D; K. r
* f9 D! ]0 L1 H8 U6 d2 J
! Y7 T/ I( G' I0 t) T* }
这样我们就获得了user()的第一位.其它位依此类推
( c. e( _' X/ d* u& G/ s# [: `! R9 J4 h7 I1 `. W
|