通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位; X# t& p) J) N% R3 v
# T* U# f+ ~$ {- } ) G! k/ b9 `* Z+ {/ o+ G! E& O
2 A6 C7 V5 n/ a2 c* [% S$ w6 c7 p9 a; z3 I下面将以查询mysql数据库当中user()的第一位为例:1 c) ?0 v, J0 ^: f
: ?" R; i0 E( k; s
% I+ I4 c! E9 {5 `1 o/ w" H$ J( O% L$ x
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)# O6 \5 p+ N* \7 u
7 k0 J9 K2 ^/ _, W/ p& z
! a* A" r+ L4 |
% B) E. l! _" d5 ~( S* i) o* d首先执行如下sql语句:9 w5 O1 f0 l. B7 [( k* a: [
% m! L! k# {8 g5 D, p# U/ I z
0 M3 I& f5 O! o- Q$ B
4 r4 ~% T! t; U% L% A( qmysql> select (ascii((substr(user(),1,1))) >> 7)=0;. R/ L" {& ]: M9 M
/ P8 N8 t* p. F1 V3 r5 ?5 v* x
5 \5 y4 [& p% i( D" Y$ P
; {9 x8 P |! O1 Q: d( W3 M( h我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的5 Y( t4 E0 ?) x& s: W
2 Y# A" \2 w. b
- ?2 y) n- _2 ]$ S1 ?
/ A, ~6 k+ N; C2 t' q3 H第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
! z z. Z% E( f. L& G7 T: j" I. a$ r2 k" [2 o
$ w# }. n1 ~1 k- j0 r, F# S
G0 e5 }( P( Y' R& Q
如果运算结果为1,说明第一位为0,不为1
1 F+ e7 Q8 d2 W% W- T" a3 I8 ]) \' g0 R" J3 L% d1 E$ [
/ y l+ n1 M* O. L, X4 Y' h
o' c, f! b! i* Q+ j1 c; W' P+ Y5 `
+————————————–+
2 {0 i, w1 w: l) m- [, D0 a' F3 y8 A3 |' T# p6 V
| (ascii((substr(user(),1,1))) >> 7)=0 |% F" J t' S# V5 i i& F- m m
. v# d, C* p+ v; E4 ]0 O! h# H: k+————————————–+
2 c, X' h. w+ N$ M6 ]( o j
: j3 w6 D8 `4 t( P- b| 1 |
7 z. N; ]* {+ L2 J, ] S2 D9 d# s5 j
+————————————–+
$ j! B5 W6 A7 c' \6 S$ s3 O* }! v: M
1 row in set (0.00 sec)
4 k! {1 z3 L @2 z0 ~, I7 a- Z [" N$ I$ c3 @: {1 ^
这样我们就确定这个8bit的ascii的第一位为0
4 F+ z8 l+ y, w* U/ W3 k% `
# L/ H3 p6 m3 E" ]3 O/ b
$ t3 r8 s5 B4 z g+ G; F
3 V, W3 F6 \8 e. X! \第二次我们来做6次右偏移来确定前两位8 c" c: Z& g7 {( g6 L5 t
& F# W; G2 U) j7 ?' r! K! P# q' f
: [! A1 X' I) ?5 T6 u/ }
" @; H, c# p9 M1 e" ]+ {
前两位可能是01或00,即依然可以与0做比较,
% L8 Q v8 c+ j0 f- Z* t$ c0 G. O2 P7 d7 @, a, p& O; W
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;$ N. q U+ a5 H5 o) I
/ @3 @" ?# t/ L8 v1 T( h& a) |
+————————————–+
4 |. t% C) B! s4 k' B; K, E% P1 [9 k1 q, }% l& @
| (ascii((substr(user(),1,1))) >> 6)=0 | Q' o# `. L4 m3 ]
- t d8 i' q# T5 l3 {3 L8 x; ~
+————————————–+% T7 I1 B4 `& M i9 }* l
% I" V9 b8 n! a, l) Y| 0 |: s1 T7 x. r* F3 z6 Y! |4 L
4 }. T( e* E$ f; p- Q+————————————–+
; v) n, m$ n/ z7 |( X- L# b5 Z6 V' ?& M% L0 Q \9 {& n
1 row in set (0.00 sec) i- `' B& P: N8 ]3 f: E# C, [; T
0 D6 g3 g: v/ F, v* D$ R & s) U5 Y: n5 ^ ]1 T u( V
& [: u x3 o( c' u2 r
结果为0,即第二位为1
5 P: }# M( h2 V* o o
( U* T6 a# ]& N- u/ M
3 y, I% Z1 R5 u$ T# b- V3 }
L. X8 u$ w* b7 F* `开始猜测前三位为010或011
0 s1 p- y* Z/ g- p9 J
; o/ f, A- r) o( ]
; ~5 c6 u4 D0 U5 U
- \( [/ ^( ^6 [! f' r9 e让我们看看010和011的ascii码是多少
! x% l& A' c4 ]% }0 v, X& ~0 h: G# D' K p
, A3 F9 G' B# a' g. i9 i a% q
4 I3 R/ w$ l7 ~8 Y5 |; U( a分别查询select b’011′ select b’010′' e F& t* T+ L( k5 s8 T
( I0 G: }* Q; y2 j( }7 v# E' s, q
, \5 q6 V1 P0 {* K S
% E2 P7 ^9 R* ^4 V% p' Q) }获得结果 010 = 2 011 = 3, L# I) z/ O2 q5 B* Q2 A
8 Q; S. G+ t7 i0 u9 @2 v
7 t/ l: j$ I4 w6 H# h+ P. A9 E' [6 t7 h; A' o/ A" h# p6 D
执行如下sql:
/ f9 n; r6 n! e4 M
& x; | m- F0 u7 ~# D. q & \$ b6 z2 ]1 d6 ^; _. S) s/ W
$ H6 e, G, H0 H0 G
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;2 E+ ^9 \# d& Q+ z
" {5 @+ A& b; h% ]% R/ e
+————————————–+( B7 V. O7 t8 l+ u
9 y; u& _0 T! |) f; P: v
| (ascii((substr(user(),1,1))) >> 5)=2 |
6 e' j6 r$ q/ P/ X* r* I% {' H0 ~& b, |
+————————————–+9 A% W: Z' f/ u! @0 |3 L$ P) X
7 z6 T; s. R7 R% ? T6 j| 0 |4 p! z5 K4 F! z3 P5 q# B
8 @4 [( J' L; l5 I* X$ O; _! x+————————————–+
& o8 C2 Q1 m2 i+ Q7 R
, v: b G. h3 t% s即前三位不为010,而是011# R5 m% D. ^; @( A. W
6 f) \2 M0 ~: k j+ o2 q. J( j( x) S ( z% k, e) U& \: B6 C( _9 O
- N) \* w/ @ R$ L+ z8 V4 i
直到获得最后一位
4 t( j( j4 t4 K3 w- m* J5 T$ s4 y- I" g1 H- r- B6 s
/ ^+ m: O4 N5 G9 X% h j" i
8 \$ S3 i e$ g, M5 E1 I' x最终结果为:01110010
x* E. k; Y2 }0 M6 G# K1 c
, I. m4 S+ X h X3 {+ L8 m % A1 @( Z6 Y9 r9 H1 ^ z
( m2 [+ Y: i& Y( O; {' R# D2 _转换一下:+ Y6 w; e$ q" }4 @) k
& D! H8 q, L; J; J3 {
3 a2 V4 J5 V/ J% J! S& w% ]* {( \) o/ `3 h
select b’01110010′: A T$ D' a9 h4 |+ J1 W& U
( H. ?$ M& ^" W
- O9 h* C: J: X+ u6 ]( E; s
& G L5 @( \, c4 a" l查询结果
' ]* F/ Y& t1 j- M6 J. q
# r4 o$ _# @' r. W$ j r$ v* g4 x: t1 C4 I7 F7 A
, W9 s# _ ?7 t l5 ^+————-+
# b# ?. s9 ?) D4 W5 N, B* ]4 J8 ]! F; D. L9 f0 f
| b’01110010′ |% i# T! m4 l0 C( q }
: n6 z6 T+ @5 h6 u2 P+————-+
- T6 d. T- d. i" W( \% r. ^. P% D+ z, c( W& I: N6 B3 a# M3 G
| r |0 M C% ]6 K, Q- x
% q. V+ u* y$ s! @: Q. A
+————-+
K, X5 @1 A( M# @% O! d" w2 J% E
1 row in set (0.00 sec)( K+ }- k/ D2 k/ D$ A
9 V* l \# w$ Y$ R9 M. m
1 k, }: v9 F, S$ J5 n, T" e
9 C+ e2 y5 T% }- l0 M9 q这样我们就获得了user()的第一位.其它位依此类推
0 f7 r! v( e+ I4 f& v) b0 c$ i4 {3 \* |" d8 D7 Q# R
|