通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位
5 \/ y- b# k* }1 r0 U
/ [1 |, \! [# M# [+ X, A3 Q7 b& T
+ r6 |1 L9 E. _# w; ^1 C9 D3 H. X; }$ V$ V8 J* M
下面将以查询mysql数据库当中user()的第一位为例:$ p4 A( N9 j- w6 M
- l, l9 g# S& f6 V# P/ v' o
, T. r' u2 @: P# z7 {- }( T
5 J* K# Q8 O D" Q. L7 H8 Dps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
1 v: P$ R+ V5 ~. j; t
) V* u5 o" [8 P* R9 o1 x
5 t1 }7 s3 G4 R) X2 n2 [( j2 x) @1 c2 o, U* P5 o1 I+ j
首先执行如下sql语句:
2 a6 K; B/ m0 D5 x
+ i% N6 c V& P+ c. n4 } ) E' d; n' @6 E/ s* a' k# X; k* b& n
- i0 p L. w7 k. z, ?/ o' J P) p' bmysql> select (ascii((substr(user(),1,1))) >> 7)=0;
( V* B- {! `: X, E; C. q. m
3 w2 R$ Q9 U3 q1 F* ]
8 A/ Q! a5 z3 j6 d# @" ?
& p3 X9 k* }! Y3 B7 z6 F我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的! w3 H# F" ]% K3 {
# X" x+ h# y* H+ }8 B2 h
4 Z& }: P2 L" T2 P( G+ J' E0 r0 p
! g N/ H. g" c3 U第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1
/ j' p3 v" i2 M/ s, b2 G! T) o1 }: @/ B4 v
/ R0 \ @( E. S" N. s X" J7 J
$ _- O) w$ j; b, q( x" p4 ]如果运算结果为1,说明第一位为0,不为14 E/ c* A, N% {9 j, a: h& \' x0 \ X6 F
r) r$ P \3 l$ Y, c
: m: \% j) W. f% n: `1 E
2 y; ]( e& ^* T+————————————–++ v( h8 f9 [+ `6 g8 D" b8 @+ G! N
& ~# X: _ h4 X| (ascii((substr(user(),1,1))) >> 7)=0 |
- T( @% t( Q2 V4 [8 ]! C# c, X! b: I2 @: `. m |
+————————————–+& j8 \# z3 r& [4 J' e/ }4 ]# u8 f
5 m/ S4 E6 m% M$ q7 p- @
| 1 |& U9 u- x$ a9 u! v$ f
, L5 c% I# J, M/ H7 d/ [1 d0 }. r0 T+————————————–+
# @9 p4 l: K( O' ^
6 @! S3 A5 r5 Y0 c. X1 row in set (0.00 sec): z- u$ _. S* r
% }% a* C( A! v7 }, Q& D! h这样我们就确定这个8bit的ascii的第一位为0
! i2 D# Z! V% a
' k7 m0 m3 v( n0 Q3 m) y 6 V4 E6 Q8 Y: Y& i, n3 r- B; x* @; S B
3 A7 [: `, o' q4 e% z' G
第二次我们来做6次右偏移来确定前两位1 v" w6 T8 `5 Q+ ?4 ?
. ^& l5 |! W# O7 O' g
# N( i' z+ }6 o k& \) H. H! T* z, V4 P5 N
前两位可能是01或00,即依然可以与0做比较,# g7 ]: d' R9 y7 F, t
8 N. ]' j# J7 I( v1 j% kmysql> select (ascii((substr(user(),1,1))) >> 6)=0;
" Y8 q! ~0 m/ ^0 v
, U1 B; \! v( z+————————————–+
9 K l! ?( t9 f: @7 \4 i3 k: l: ?, O; i0 l7 X8 [# g+ [
| (ascii((substr(user(),1,1))) >> 6)=0 |
3 D: a: `: O+ C/ C! X" I( H. i
+————————————–+" Z. Q) x- M, G, F7 T
w8 v4 p' L) f$ D" K| 0 |
, x5 F* Y |$ X: v: F+ ?3 g: x% [/ V$ [" v4 \% D' s* q1 j
+————————————–+
+ }* }3 b& [ m+ y- d% F
& l" N+ q, \3 ? p' @# d w9 Z1 row in set (0.00 sec)
1 l3 u5 B t& U0 g2 h9 y$ a9 h& ]3 r: }; t% ]
5 b, Q0 |! j' B+ B
# y, X$ T; V* m; v0 N结果为0,即第二位为10 N& W* m! r, ~/ Y0 ~, \$ v# i& w
" G8 F1 l: N. o; x- k8 ]/ H
- f: N, w, L% B1 C4 q
$ `% w* {' ?1 M9 Y5 h( G9 K开始猜测前三位为010或011
. b( k7 X2 k6 s! Q/ S) n; l
" V: n8 x1 a. e# ]' U" p$ I
! A5 {* K( |( t# i/ e- C* s+ e' C! ^' T9 {
让我们看看010和011的ascii码是多少
) @! P `( p5 F' f
. X9 ~! V6 B' h* X, T- p 2 D. r& ^$ v1 ]! z9 |; Y# P1 a
5 `: f9 u; A) x t分别查询select b’011′ select b’010′1 U4 ]$ \) \$ g0 M- }
@& b# R4 T0 F4 w8 P0 z
% |' E! D G) d" K- U! `. v2 V$ a5 l5 Q) |. e! c, r2 j
获得结果 010 = 2 011 = 3
- E7 J% Y8 I0 b9 V2 E1 X( r/ c* f8 p# v& E3 r3 R" b0 Q
: X! [- |+ i% C* z- L) d
4 S5 O. V! H% Q0 Q执行如下sql:3 K' r" ]4 U5 Q! z+ d6 [, h
2 q% j8 O+ K$ E" \4 E G) } : ~ L0 ?. T/ m4 S
# n* _5 X' k3 w7 V# ~; n: p7 pmysql> select (ascii((substr(user(),1,1))) >> 5)=2;) K1 W ~! Q3 b, m f
3 W' d9 r* Y* n1 c) x
+————————————–+
" w4 h- u& D! _+ j. k9 ~8 L- k! m' G1 R& |' ]) ]2 {
| (ascii((substr(user(),1,1))) >> 5)=2 |' ~) r. R0 n/ x: W& a' |
' {- u7 m5 Y" ]2 `1 l+————————————–+
7 O( F& I2 m, x; W/ h8 Z' Z' I
1 f# z. J/ \2 S0 a+ x' ]| 0 |
6 c- l* P" K$ {' D5 M+ l0 }2 ?
7 c L9 P& W2 ^+ {2 E+————————————–+
7 n# z2 w' |2 x3 @" i1 K2 K4 W' D6 G' S: J7 X5 c
即前三位不为010,而是011/ R6 O7 M9 t' e& _
0 ?# V- [8 T8 |/ |. u
- N7 B( Z: Y! o# T1 q: }: z6 N$ B
: r6 I1 a- U# f: D2 Y直到获得最后一位6 e f* F# v; r- H
/ @% ]7 @5 v# ^, s + f3 ]% U) W# S5 X& O
8 j7 l E! {/ Z$ X% J
最终结果为:01110010! }) \: w, k2 M1 L" S) r
! D+ O* q; c4 K, t) Q % e6 a" p0 G/ Y" [0 L3 d
. @# X8 p( J7 G
转换一下:7 d7 K K4 X3 d2 m3 ^0 ]# u$ H
% V* C! S5 I% [- j* A! Q8 O
% k, F: O, L- D9 x- O3 \; N2 s1 ^* m1 r3 o" E
select b’01110010′
$ k$ J& Z% H& c L2 |. N) Q0 q: L# Z4 E
5 `+ i+ t, v0 n2 R& }4 H! s
- B3 \/ T5 i: Q; B) n; W% P9 v) ?+ Z
查询结果2 R1 c& I! l4 S, h: Y* A
+ }5 H' N' m3 E0 e4 V / ]0 @+ U9 M) P3 G) ^) P
- e: l I) r) I/ J5 |/ _
+————-+
, V9 f5 ]6 ]5 F
/ p7 R b3 j+ y| b’01110010′ |
# V6 }0 ~# l0 S" ~& `) n& g; |
- K& b1 p! L' V. O+————-+! F$ z; V0 [0 x& r# T( v2 I
! g3 C& u5 i" R# L1 ? i: C
| r |
' X1 w. D" n, U" Y4 S
$ q. [8 Y/ s9 Z* }2 s* P4 f8 v. {+————-+( m* q0 O) ], t' j/ \4 e7 T
/ N6 Z& I& J$ _8 I2 X
1 row in set (0.00 sec)
% y- l+ Z6 z; @0 }0 h& N2 ]
# ^ U v/ K7 M5 ~7 P) F 9 d3 } q) j3 C4 l6 B
; D7 v3 N. M+ {. N2 {- N: X, e这样我们就获得了user()的第一位.其它位依此类推# M4 n7 b+ v" a* T/ D- m
; t5 O; F* g) F7 i4 l$ r- C
|