通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位; a, s' I$ B8 w+ e
9 N. `3 f! K# X2 U) [ * T4 ]; P( r+ g8 } m& ]4 W# V
: z/ d, U7 w9 i) J下面将以查询mysql数据库当中user()的第一位为例:/ h& D7 i8 i" { Q% i. n9 @/ g
, W9 s( \6 L6 H2 G C, G* w
- K3 z( v: ]) W9 [! v3 ]2 n# }1 H, @4 b1 t: ^1 B; j
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
' o+ T' w4 p% V: S9 U, A5 K; S+ S7 D6 J+ N
: S7 H! \$ I# @0 G) |9 @2 G! T( K; R" f$ d t; B% T
首先执行如下sql语句:
& x6 p6 e# f4 T; ^- ]0 w, W+ q
; @8 s7 x6 K1 A
! B# _( d4 W; a+ p3 G0 b4 m* O. R, m: x. @2 o& J9 o F3 B, q3 D# _2 `
mysql> select (ascii((substr(user(),1,1))) >> 7)=0;3 e% ?+ F+ B/ G# b8 c; v' L' L
: _/ e0 M6 j7 c" e2 z" T 0 J% l+ |: s @+ }
6 T8 F, H- v3 h2 J/ G
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的' z; d2 O1 @* D# ]
9 ]* [" f/ \4 Z8 P$ k: k
+ M) I( ^5 u/ z5 D! }4 g' m V
+ E( D( L" L' f! ~2 v' d' K8 f第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为16 |6 p9 d8 a6 s/ C
# J @! _1 r, O3 t* G$ u
) E. h$ _' Z# ? v
^ V# G) S' |3 I' S, V如果运算结果为1,说明第一位为0,不为10 ~) h, S# E) U* y; N6 U# o
, u Z* O8 J$ _1 A1 g) `
/ ?' T0 Y! ^- X# T+ q6 l
g6 C) c$ Y/ P0 _+————————————–+: C2 X. t" g9 y! U
/ ]# j1 |3 m. p/ W8 ~8 ^
| (ascii((substr(user(),1,1))) >> 7)=0 |
- K* x5 Y. ^# ?8 @# M7 O: }- L" c8 \/ D+ ?$ _$ y1 g; P- ]5 V- x
+————————————–+
2 F4 _ I$ Q* x- w' j% [/ } ~6 Y" B4 a2 }; ?8 t2 \
| 1 |4 x2 n0 P* w3 F4 k- r
* H6 K$ F/ A) M$ d/ m( }+————————————–+
) l- Y3 ]/ k! }6 R' m3 d
" `7 ^+ G+ L q; f0 X' S) @; X: T& F1 row in set (0.00 sec)2 z0 i9 D# B% P7 Z7 b) Q- I
3 i7 _1 G6 `2 N/ @
这样我们就确定这个8bit的ascii的第一位为07 @6 D. i { e# C! J; d! F
; D- d% x& P3 Y7 a2 Q7 {
5 n" A4 D/ D9 \
' d* v8 N) W# W4 `第二次我们来做6次右偏移来确定前两位
0 @2 |7 A! K8 ]" t. S3 u
) S1 U+ w4 e; E/ C
7 B1 U7 B+ l8 M" Z' g) s D: X$ s
前两位可能是01或00,即依然可以与0做比较,1 K4 v! E* ?7 @9 N
. _, I' ~* F; ~mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
$ ^7 \/ B& l2 s8 O
; [: P$ E# U3 _" p1 W, y" I3 A+————————————–+' ^% `3 R: ~; M' ?; ] T! B
% L' c9 J) w' P! _3 D/ ?/ }% U| (ascii((substr(user(),1,1))) >> 6)=0 |' A' g) L v% O) m
8 S- j% ]. V% Z2 K1 T+————————————–+
4 M/ w( j; T# D ? f
$ }& y1 W0 H4 n3 ^5 G| 0 |
) A% u- ^6 d; S8 e% D0 Q2 r5 G5 X: B
" @9 x9 F# h$ M1 T+————————————–+
+ S5 ~, v0 S; N9 }4 u! K! w/ ~, L; N
1 row in set (0.00 sec)9 F h6 s* R+ c2 Y$ S
~, y! X. B) g$ E
% }. G2 S( ^1 k5 c# X2 f% i6 j) a! m$ F0 Y' n' y
结果为0,即第二位为1
2 U: f' `0 u$ h$ h& l6 ]+ N2 l" _$ t7 @2 D, D1 I ]# y& e$ h3 S# Y% P
6 j: B6 Z) s. m8 S h
/ ^, \; l: [9 \ w' Y8 H4 N) a% p开始猜测前三位为010或011
& ~4 E2 b$ r4 Q% O; M
7 ?, E. z/ @5 W Z. B7 A
+ r, O6 m o6 e6 C- b$ C! }/ C1 ~: P) c$ T- _! Z9 a& U& B
让我们看看010和011的ascii码是多少& w1 P- \) `9 G V0 z/ ]
9 ?$ g% {! P5 _
; l0 O4 _' ?% F5 H' O7 w" M3 J
& V5 l0 i i* h! }分别查询select b’011′ select b’010′3 `! P" W- E: v
8 f. N3 |/ \2 J* I
$ C7 j' I! I0 P1 e* G2 C
$ M4 k+ ?) n" V3 B; }获得结果 010 = 2 011 = 3. _1 D5 y, C! D0 j
; [7 u6 \' v' u & a( ?4 q; |! A" t
0 D! `/ s# m5 \9 F8 g- U4 g4 ~; e执行如下sql:8 D( |! H7 |9 I; B* D2 t3 p3 h; I
( C+ t7 {& |( v/ ^0 o' `; ^0 M
4 H, h4 x- d; T0 u$ I: z
$ s; d& K4 J6 c# `mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
+ c' A* C1 y, I I% k2 e3 C% m2 _+ T) u0 a+ e
+————————————–+3 y2 y8 i" O; F/ B' J% L! i
, ^! O n+ f" @* [& d/ {" b| (ascii((substr(user(),1,1))) >> 5)=2 |
( W+ P3 y) k! z% L$ D0 m3 P$ C0 z
# K3 ^( f5 N* j" P1 L7 g0 }) r+————————————–+6 e3 b% t% H0 D/ A1 { @
8 H1 L5 C% O, n6 P4 W( [| 0 |: ]0 `$ V5 B }' L
6 g6 Y' ~1 o+ A2 _/ a( [5 U. W+————————————–+ s) M9 W7 r( y) Y' a/ W/ L
" o& _$ J) _+ a9 z1 U' L8 u
即前三位不为010,而是011: a2 K( d% K$ z6 Y2 [$ O
- N0 d' |+ i! [2 }' `6 P
$ M8 F6 W% }- Z4 L9 s2 n
0 S9 Q6 o; G( R3 S" V$ R0 R
直到获得最后一位. ]' O8 c. J e8 }' b
0 N: \3 M$ x/ N/ [
/ H2 r5 x& S+ \+ \% {9 b4 o
5 U# ?0 B+ C( s最终结果为:011100103 W# b7 V9 X# [ `8 j- z2 [, a5 e
: e: l3 g. ~; r( b t1 d& b
7 P( p) f+ A* n ?% v. v& \0 y) a8 c3 i+ y- X
转换一下:# l# t7 J, @4 p! u6 f. W
( `5 |3 v% U7 d2 j# X. q
9 o4 k/ q0 a0 [9 @* E: A8 b# p
/ j% S+ T. | W- gselect b’01110010′# g3 P3 n5 T, Q+ ^
( X G. L+ Y0 [5 o P2 z+ O! P, Y
. d2 G. R6 P, Q- S6 R- x9 g, E$ |
; n9 |: v! i/ H
查询结果
4 Q9 L9 G1 L1 C$ k5 T% x& N
Y1 } V: _" v1 ]$ w! B
( B3 @- ?8 d5 @1 c" \5 @6 _- f2 H* W, o: W' u) L4 @5 R
+————-+5 W2 q/ G% U* [! i
6 ], D/ O9 L5 z9 G6 T+ G7 E; i: h| b’01110010′ |, G" @+ E9 Z7 c
0 o9 y0 x& d; P; K) I* ~' o
+————-+. u$ N! O. x0 n& }
' g& ?" e( E- J! q3 |& T& f| r |8 h8 Y" g$ c0 i. T- z# V+ A
. r8 S" H7 J' T+————-+5 O9 n1 K! Q9 r S
, K& E. Q# U/ r4 b5 D1 row in set (0.00 sec)8 I0 i% R3 h: c" y/ y
1 o7 l: U* _ k# H) Z) S3 g
" a" \/ P4 ^9 r& Y) E' v1 `- z) ]
$ @" |8 o' J, k( k这样我们就获得了user()的第一位.其它位依此类推% M( v& j5 ]% v3 |; S3 ]
) q* [! ^& a* t+ e }' `/ g. d |