通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位, f6 ?$ _$ F; S$ M* G& r# g% S
4 n8 e! }! e3 R }* {" A
7 n U" t) X" J
) E5 X( G1 }3 @/ X$ v& f$ ?# S下面将以查询mysql数据库当中user()的第一位为例:" ^9 `6 D4 R7 q ]; z" v6 X1 }. m, K$ Z
/ N* A' f. E& Z* N* d- Z
7 G( u3 I) O8 M
% V% D* C! t5 T- |8 I9 G$ B
ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)5 w3 v0 O* f* s
. Y$ `* n9 f% ~+ K# H2 {
# j; @6 t: V- E* b% O! q
( r1 F1 U; B8 ^& J6 w) |" M首先执行如下sql语句:4 }; p+ y* ~) C
8 \4 ]! y( ~7 {$ Z
9 r0 e( A- L# S& E7 h% A4 v8 _
! @; y3 A1 o. I+ R: f0 dmysql> select (ascii((substr(user(),1,1))) >> 7)=0;, T( Y- |" t* h9 T$ C3 d' j7 t8 j
. E( |: ?( E' R8 {- L
* }3 b* D7 B. z
4 V# f9 U+ E! U- {) j
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的8 D4 W' ?& B, E/ Z u! A0 @' o
; N j- x% i( }
9 [, n6 e- C3 [/ X* l) r# I5 Z3 `5 ^8 ^
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1, [$ {- h/ Y1 _5 n& @
# r* {1 k0 i. N) D/ D* C
$ ~( @4 T0 W- z1 D( c7 S
* Y& R- t5 N0 I9 a+ w F3 P, c如果运算结果为1,说明第一位为0,不为13 z2 r" l& S5 T0 a
6 D. M3 b7 X C8 D6 b5 f* B % x# Q3 b* M' a- O9 s2 ]3 S% T
+ n4 a+ x: m- \3 F/ L* P+————————————–+2 S' o* K, d6 N$ B4 `1 ]
8 Z1 \! I j! R& _1 B/ ?2 l5 t| (ascii((substr(user(),1,1))) >> 7)=0 |
. J/ \: ?# {; m/ _. S4 h6 o
% W6 L# g# X. K0 V7 H+————————————–+
7 g; R1 l% B6 U" ~0 m. {8 N6 S$ P7 ?7 x0 ]' l# K% G' b+ w
| 1 |. Y }) W2 p$ M: o
# v9 f+ t; {; M9 i+————————————–+
0 t0 W& L9 u. R6 B
0 o+ [& f: N8 X; \2 J% R& A6 b* M2 j- M1 row in set (0.00 sec)9 Z6 W4 Y- b" U
$ K5 v. i; Q1 k% [6 c& ^! j
这样我们就确定这个8bit的ascii的第一位为0! \9 }' k& F1 l+ G- \. K
/ b& h$ T5 B1 t+ a$ E# `2 Z6 ]
5 k0 P4 W; {4 ?3 t( h d0 Y, a$ z5 q
; D' m# J# I4 x: d8 H- B) ?- I- i( _第二次我们来做6次右偏移来确定前两位0 {" ^5 j1 Y9 J6 q0 m
7 P1 K! D7 N! X
' E# ~( }- K" B6 H4 a2 Q+ A& q' p8 W5 ^% b/ G
前两位可能是01或00,即依然可以与0做比较,
R: m) M* J* ~+ A0 }4 C' x+ A! ]6 W6 ^9 Z4 B/ K( t
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;% E+ h$ Y% D; v. A% |+ c9 ^7 o4 [ U
# V! E# e' D7 o: A+————————————–+
5 M% c; Q2 G' Y/ L* }' S( [1 n! X. u o& z+ P
| (ascii((substr(user(),1,1))) >> 6)=0 |
+ w- s+ {) U9 v# G: X/ u: }4 o9 \& E$ h2 v" X, H2 a
+————————————–+8 N: l: y% a7 L/ l( e- X
( x$ \6 A6 J6 V8 F3 W| 0 |
7 I* O" G: w/ b( z
5 h# N: `/ d; }' c& U0 i+————————————–+
8 N% Y9 B5 t1 d+ h7 h* w
- {& | c0 e% g9 j* h3 R1 row in set (0.00 sec)6 l( t. I" [+ D9 K* F, Y
( `9 D& |. n t2 \# Q0 r
8 I2 g9 z. N- B3 C' e# C" q1 t, m' X8 {4 R! Y
结果为0,即第二位为1
6 q" U/ E0 t u( z" J- I5 s; B
, J6 D; R/ d# N: T6 g8 e# J& C0 a) F7 j/ z9 I
开始猜测前三位为010或011
& X; {& \$ _; N' ] f f" n- F
( y# p0 F% p# N4 H; U
/ p9 o1 b3 M4 J& y7 I. ~1 h# S m4 ^. {
让我们看看010和011的ascii码是多少
8 e2 L7 [" w8 U
, o2 \5 ~& k% s- z8 h( i : f! [) I7 o5 \, x5 Z5 g- l
2 T! \0 l# E( B0 M3 v分别查询select b’011′ select b’010′2 s& w E; Q2 h/ v
* n7 ~% b3 P2 C5 ?; J% N ' T* S( ^9 l, N$ A) F9 K4 l9 |0 P# J
& j; m, y5 j' N! e9 B获得结果 010 = 2 011 = 3
: d& G9 g% q/ H" t( O
- z P/ @3 {- p E! j9 e# {6 u
, `, l! y! s$ v o
; i5 @& U7 {4 u$ Y- L7 t执行如下sql:! s5 m: x# {/ h* R. s
' b! m K8 ^8 K& A" N/ H
7 r# C u) M4 M' _/ U, |
1 V: N9 t2 s: V/ d. @. ]mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
. |: a |# {. a9 w+ r, q% O( h) c3 p
6 O0 J" ~, a& R' }+————————————–+
( Z$ Q" Q: x% J- F. g0 \: x. @6 {9 Q9 B2 E. T
| (ascii((substr(user(),1,1))) >> 5)=2 |& M( {2 E' X( l! \5 P
8 [ t6 j0 ~4 n; a1 S+————————————–+# w( a# y. N5 z' `& h; ^
- \/ _* t7 R, w1 A
| 0 |
; D& M; D7 P3 i ]- {" }" ^' m& C+ e6 z
+————————————–+; @4 m, q# z' I/ h. s4 B8 g/ I
4 N" T# M& x% w6 ~, S6 T
即前三位不为010,而是011" a) ~7 n) q4 U( d6 ]
2 O" N. z* D* L
) u) X D: T( G8 O, e0 p
2 A& ^7 \% x, O" d1 ~直到获得最后一位% W' @: m/ \, ~" q
9 |: [' S9 B& S0 g
7 A3 [: A% Z+ L
' {) Z7 v# ?: g最终结果为:01110010
- A9 n0 O3 w+ o4 E" U* L4 I3 s$ f0 G$ }- \' N
, ]8 R) }9 m5 {4 ~: m" J
& b- D# \8 s# a [/ k+ p转换一下:
& k q- s: y& \3 z# G7 G. w% S
. e7 e( p: w8 m% S& t! x3 { . g" h2 b5 n5 n0 X
0 y5 N5 B2 B$ A6 |, X4 y$ wselect b’01110010′0 [( ]* ^6 v8 V$ i0 n* R
1 C8 A6 T6 q/ y( m( I3 ?
' g, A! g) ~6 ^2 ]2 }5 L4 q; k5 Y8 S1 D5 X
查询结果
! ?2 `' S* m8 z& [( b( J2 g2 q8 y) ~- Z/ J! F m. B
9 `% B p) @" Q4 a M& f7 l& s/ G' I, A5 T, `$ }' E, ?
+————-+0 ]& x# z& A1 C
( b# `. h( F$ D
| b’01110010′ |
" T+ n& W; A: E: y b% ?0 f9 J2 ?4 f6 w4 X/ U
+————-+) r ]8 c" Z! ]. x" g
n; L) ]6 D6 @7 m
| r |
9 p/ K1 W; {5 R( _. l g% f: N$ J2 s' B
+————-+" O! T# F/ z% O' \ w
" r/ g3 y) ^7 [) n2 @, C! V1 row in set (0.00 sec)
M# V e7 x3 {" H4 A' {9 A+ Q6 f
5 Q4 A* o+ J& }9 \* x$ X
9 t: F' R' l$ U, S7 d
' W. e; d I4 w' Q/ m这样我们就获得了user()的第一位.其它位依此类推
( O, B, }" c" s. C" \
7 f7 }, q8 \6 S' k" N |