通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位& Y: L8 U2 p/ q9 `: C/ H
% D0 U) s3 }% l9 z5 `& A
2 R( j1 J* K5 `& W. a j- j
% |" P5 ~( X6 E$ T
下面将以查询mysql数据库当中user()的第一位为例:
( S: m7 v* V! M8 a6 I- i; i# ~# q. {/ v4 E9 {$ U. [6 X; U- `/ T
! l* S2 M/ z+ c$ P9 ]
/ a" @7 i) A5 K! [8 Tps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)/ m+ W) f3 `5 k. P) T. t( l- O
5 Z4 c o% i# g2 m. F- E3 R 4 ~# d& X0 M% p$ _7 t7 g; M0 m7 S4 P
0 `% q: D+ T8 P4 M/ U9 a/ ^首先执行如下sql语句:+ b P/ L" Q) M% C" M
: U+ g) U2 F1 X6 O& Q9 {
; I6 x* y! u; r/ q! f d; K& p: D6 q/ P& d7 J0 i2 K* z% t$ E) Y, ^! q
mysql> select (ascii((substr(user(),1,1))) >> 7)=0; ^( I" P1 V7 ^) {2 Z* f. i
' U1 X% g7 w0 n, Q% b, ?
K* {4 v5 j4 _8 v
( c- y9 `8 L+ }: a4 A' D我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的2 I# G- |7 {: D7 W" v, t! W* A
" X3 y I2 \* _/ v7 Q3 ]9 r
( E* ?( l, ]% s: h2 m
0 K! N/ H( {$ d8 w- K第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1- s, F- J `- a: x
) w* p; O+ J4 l# U9 V g 0 I9 B) V* B' A4 _' _$ j; g9 z
0 `2 G+ i" c9 G y% B- ]% q7 x如果运算结果为1,说明第一位为0,不为10 F3 r6 G: z) G' D1 |/ D
' u# b" s b! ^$ D- P 2 R9 d% L G9 O% d3 Y! O2 U! {% e
6 G& G( e7 l- `8 E+————————————–+( m$ I1 }9 a9 @- }$ b- r9 [
/ w# `& j3 p3 w* ~ l| (ascii((substr(user(),1,1))) >> 7)=0 |# K+ g8 ?$ i9 H8 _: u8 d( O: T
4 x! s {+ Y. A! |* f0 s
+————————————–+
6 Z9 x0 s8 T. o; S3 ?- v. R# G. d6 C E# T" i) a% M. |8 ~" J
| 1 |
4 p" |' H9 Q I; B! V. X' x' \% e- l6 [3 [# S& L& v
+————————————–+
2 O5 k3 X+ b+ b E: K# y3 M7 `9 b2 Z
& X/ m5 Z6 m; R! z1 row in set (0.00 sec)
# T, k- j; q( N# g* Z
m4 l4 M2 H0 Y* _这样我们就确定这个8bit的ascii的第一位为0
+ y2 }2 v5 c, d/ Z2 R5 ~. b0 b+ H6 [* C: }3 {2 o& U
8 C- P- z$ f* E1 j/ |8 p# {7 J( x6 j1 e/ k4 ]# C9 }2 b7 a
第二次我们来做6次右偏移来确定前两位
1 j! t7 J( q* M% ]9 V# I9 ? k# I% [& A8 r/ C
" }- o. s. ~+ `9 h# L/ T
! V# t6 r9 X K2 X前两位可能是01或00,即依然可以与0做比较,
8 m. [- c; k1 _5 T5 _) y
8 N$ N$ ]4 W7 dmysql> select (ascii((substr(user(),1,1))) >> 6)=0;
4 f. {) m2 n. I
6 F& Q) l( a0 ~3 r+————————————–+
- ~! G9 `( H2 T0 B ]9 |' y
( D8 S) P! T" ]% r4 b/ Q: m| (ascii((substr(user(),1,1))) >> 6)=0 |
6 R+ v% j; a$ k5 K' i
* D9 s# _# L$ z L' n+————————————–+
5 E1 c3 q- f7 i6 j# g) N* ^% [" w. }( r! X0 l @
| 0 |" V p z8 _* K+ K. ^* x
8 r8 y3 o+ ]+ h: A+————————————–+% Y: q& k; ^- P( E2 D2 x
" w& w0 s, |5 I* ^ c3 m" Z
1 row in set (0.00 sec)& T4 l8 I% \5 \: t. J5 u8 ~7 ~
. l0 m7 X! K8 \) L4 i; K
9 B% ^4 d% m, l ~3 [
$ N8 _2 P. {3 i$ l) Y; e4 p0 V" [ D
结果为0,即第二位为1
; |: A3 C5 E+ P. D
7 T0 {7 W& Q- @) f; u; R , Z$ i+ m6 F! W0 F5 k+ Z7 h
9 ]( C, m- z& C1 C3 w
开始猜测前三位为010或0118 {0 q2 J: ]" r
: R$ Z; J) {4 O7 B . o' ?& T3 J; t0 j% n! @
1 \! t" A6 d( S- ]1 o! K1 R" }让我们看看010和011的ascii码是多少
0 v* F Z' F3 d
" ^1 C2 o: S8 K) R8 R0 w3 B , s- k, }2 L$ e7 C1 W# f! L* E8 D
' ^3 h h( O0 a" A
分别查询select b’011′ select b’010′
' f' r ^& B2 h% i# `$ R
1 z: Y: |. ~9 c1 i9 q, Q, T) `8 p
1 X' T" B1 T W# s G2 e- c3 X8 H4 a" `9 Z
获得结果 010 = 2 011 = 38 s9 }4 C( x. y% Z
! g/ o5 ^7 E) T
$ K; [5 s, D; j# Q3 j4 ?- I9 Z
. I& Z' V1 F! H) R D$ ? T执行如下sql:
, V( [: y8 O; n0 S/ ^; a# r! S. [
+ E; |" k4 b1 R8 A8 d # Q8 N4 |+ K- R' r' g3 ]% X7 n
" X! p3 [" [6 G
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
! z' g- B7 j7 S7 u D7 ?! E3 A [0 f3 N% s) |9 `( K0 I
+————————————–+
3 Y, V: T- `! y1 c2 G8 e
, _; E% d& k, ~( ^# V| (ascii((substr(user(),1,1))) >> 5)=2 |. p+ F* E) h1 j4 h
; R* [9 w. }, C% g* ?+————————————–+
3 q: H! F3 O+ F2 Q) H1 ?2 j
6 E5 `% j' n0 t) ]' l4 \| 0 |6 M2 d0 |! L' L, E
# B0 `% D1 A" C+————————————–+
+ d4 F. v4 L4 S$ L6 w& [/ [" Z( C( b9 | K1 q; H
即前三位不为010,而是011, m( ~/ a; {, e9 ^; t
: C& n/ F7 ^+ k/ w3 W: m3 E- w ! E& V. ] i7 }4 j% r. ~9 w
5 L5 v+ @; q! G1 E& ~+ `* Y直到获得最后一位) D: t6 J4 Z( d# D! y: p D( P
2 m$ }# H& N$ V2 Z' Z
`0 |4 ?6 a6 S/ B4 y
6 u0 j- r6 p) a最终结果为:011100106 }0 G9 f$ Y) h6 z7 i
% Z x) s7 S! B5 P8 s
& S& \; Q9 ~. @: h3 y* T, n+ e ?1 W+ u, S4 \6 }/ d% N- t
转换一下:
2 F! s4 y- ]: D# J4 ^( D G5 Z; q6 v+ v# P" t$ O q( S, |
2 K! k( W# T1 Q' ?1 L0 i p& ^9 F
! u6 A1 g7 Y" w+ n8 t, s& xselect b’01110010′! x, R+ ]1 a8 R
9 \# v) v0 ^' t1 [: p' J
4 D& i) f P: y4 s; g. X" Q! F c# z0 ~7 i9 V' ~7 V, c
查询结果
) X2 b1 ^. v1 x2 I& q! G3 S
0 D$ m$ J, W* _ , C2 i! m! o9 x t
1 r* n) v- l! c; ]4 T3 K, V+————-+: F' T. _' w- y6 S9 H
; S$ f! x6 {0 _1 o1 A' n% J# I- @
| b’01110010′ |- c; z: r8 \- Z% ]' {% w
6 Q, Z& R; P7 D
+————-+
2 r1 J9 N6 n' @: N# z3 g# Q) _ P( P+ [' c+ T' K: [
| r |
7 F; ~1 e/ Y. ]# e1 N/ Y! a5 n" m+ z7 G# K
+————-+
2 X; I( _. b/ o# x6 U4 {1 P
( p5 J+ _; r/ c1 \7 t0 g1 row in set (0.00 sec)
* l7 n& m' y" _3 t' G# Y, C$ r
! b8 s) }) l& I- z+ E
8 |( Y+ q6 z& |0 t n G$ G
0 R: a, _4 k0 \6 B6 L% y; |这样我们就获得了user()的第一位.其它位依此类推
' g4 \6 e' Q4 a7 Q" p" X% ?8 N" o! R
|