通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位! v7 x4 ?; M! _
8 S+ W" @2 ?3 u& E% E1 i, q% s* P2 n
$ B6 Q# K( l" M4 I! d7 k+ P |# m( f, N, L' k
下面将以查询mysql数据库当中user()的第一位为例:7 C, }0 Z$ {5 B. T* `8 C9 a, S2 ?
5 m% w) I% R& I+ K- w0 N
; ^5 K$ I: b# \
7 x; w' U% v) e7 m; @, z5 {1 O7 eps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)
1 J, W# F3 ^8 T( K, @$ {# E. Q G& g( \$ u( q
( P2 F+ [3 i; s; Y' [
- H4 ]5 ~0 ?( z# V8 g
首先执行如下sql语句: @2 }3 b. t( l8 ]. A. |, G
' \8 b* L) B) ~ o! d
# `9 X- `9 {6 v" x, b* m: q5 o
, k9 q l3 ~- O8 q) c% Z# Zmysql> select (ascii((substr(user(),1,1))) >> 7)=0;2 x" b4 o& R* Q/ h
$ c' x9 @3 h3 G" n: v. ~+ ? 8 O9 k' V9 h7 C" _8 Y
0 C1 ~/ y* U. {, W- V
我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的1 ^- q, |% |+ m' ^. u
: e7 r$ n3 X3 }* o
+ X. {7 V/ e9 l! }0 \6 L; D, j6 O7 _ a" x( K5 R5 W- a
第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1' Y; D4 A2 N9 A, y% x1 v
6 b4 d3 a" c' Z8 t a
; h8 ~1 [- d2 F4 Z: X
/ G) O. Z6 l0 t4 A( G( B如果运算结果为1,说明第一位为0,不为1
4 d1 e- }1 Q( Z5 c9 _( q3 P, E" w/ R8 ~( g
" B" Z& | M) y2 K( | {0 R
6 R: A5 y b7 H' D+————————————–+
! O9 x/ _6 A7 X, |2 C0 ] y' g/ F# E' ~5 r) q% t
| (ascii((substr(user(),1,1))) >> 7)=0 |* q9 d* C% D( l2 c' [6 x
5 M$ O7 k6 T5 M6 G m% ]+————————————–+
9 m, t% ?: `4 { A$ ? T0 |0 f# q
| 1 |
( g9 ?: S4 S( L" A- e/ k
0 G9 I: Z5 p0 _9 l6 q: B0 l+————————————–+$ M' a; k s8 f, i" }, z
# Z- [* U3 |9 D! x) C/ u, C, U1 row in set (0.00 sec)
; J; e( e# u9 {/ O8 J3 X7 p9 \, o) [1 P- O9 d2 y; w8 v
这样我们就确定这个8bit的ascii的第一位为0
. ?6 ?8 t- _( O: f5 X
0 c6 g, B5 _2 q' D' c! ^- {
) H6 V; e; A7 K% f
( x( S$ s1 f# ^4 M* R9 D( _第二次我们来做6次右偏移来确定前两位
h% K+ {) H; c* b8 A g$ A
4 y2 L+ u6 d# W6 M8 F . x# Y7 T0 a1 } Y6 i) ?
* `$ |" ^) h9 m( h
前两位可能是01或00,即依然可以与0做比较,
6 T) @2 b$ p0 ^ R+ q# ^3 t1 Q. p: Y, j6 K6 D
mysql> select (ascii((substr(user(),1,1))) >> 6)=0;$ J9 b" r; [+ B0 o3 v4 \ N; o
+ v; d/ `% \1 b6 j# A Q. x+————————————–+* i" L* Y% r( I: f2 [4 Y
9 E- l c! n8 A/ U| (ascii((substr(user(),1,1))) >> 6)=0 |) B" Z5 `, q! g& ]
; r0 a8 J. Z' G( q& L, d+————————————–+
& @0 m; y$ `1 Q( n
. t, t" O6 C& ~| 0 |
, T& Q! w$ }0 H, R- {% C- d( s0 [
* Y3 m# S x+ H* n: M8 v# u3 Y: }+————————————–+
& H7 Q8 T* O% k: ?# t
; K3 ~) c8 X, i b0 x1 row in set (0.00 sec)8 X; ?: x7 p' L3 M+ h$ f1 K
2 T b0 T9 E6 w6 g5 g- {/ X 4 h& E, O" L7 z8 ^8 s
% x0 I2 `1 O% {4 Y, ?$ D3 H结果为0,即第二位为17 w2 u5 D9 b* q& y& D
a) R: s. K! [# b6 f6 @
! c0 e- {/ T. D& k
, t8 @1 v/ w2 C1 a8 ^' k/ e+ g开始猜测前三位为010或0110 {) G( \0 [) f5 h
, f. Q& w4 i: w% V0 e* _/ Y% i 8 ]+ r% E3 G3 y+ u
! N3 c: F/ a5 A: I6 A( u: e4 r
让我们看看010和011的ascii码是多少
0 f: i, }) E; t7 P6 [
7 T. `. C. h+ A
- n3 |/ d' `, D; I8 o3 u* a0 g: q5 R* W
分别查询select b’011′ select b’010′
7 N0 c. c' s: H2 M- r
4 w3 m" Y# @! E" v# Z0 U9 a% `
- _1 |0 A& s! e+ w$ J) M+ u2 A# Z/ Y. W" C6 [
获得结果 010 = 2 011 = 37 m4 t( V- p" R9 S& @ M3 B5 P
3 U/ c' `9 z) a+ i
, Y' r' }, J- p7 y( q9 b
- C' q# R& g. {& C& m" G0 o执行如下sql:8 J2 m) P1 F* ], t( b
! Z! Y# `- }/ A; w7 f7 O
( ^/ I4 \: L; u: c8 a
3 w$ G2 o4 p6 N9 G
mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
9 C! y: c7 d! {, @0 w. w- A+ x
$ Q' M( T; [1 r6 m3 P4 @+————————————–+
+ h' {9 B, L' n; w% B
z" V3 `" R6 P/ E; n| (ascii((substr(user(),1,1))) >> 5)=2 |( a3 d: E7 C( B, a
0 W, r) t; J0 P+————————————–+
7 G% S( n) F8 S8 n: A4 y r. T, T$ q9 X8 O' J
| 0 |. f( x8 ], @9 p/ r9 O6 j4 O
; f) x1 s3 {5 {- N+————————————–+5 e- x- D8 M; ?* ]% j
3 J! F/ i6 E2 A S) ?; H7 R2 ]; y7 i( u即前三位不为010,而是011
0 v1 \' F4 j ?& w7 R( P" L4 ~" G- R0 ?% f; L
' W+ S( H- W) G: j4 W
. @' X$ H* t7 o4 e& j7 K# Q直到获得最后一位
) g0 K( z7 C2 c3 ^- U
+ k4 H8 v b2 N, ?/ H* ^; h/ _ ) _) Y) r [1 n4 f* u" F0 r
- n/ D' Q; ] x+ @
最终结果为:011100108 o3 E6 l; H3 w2 W% ~8 q
2 I& D' V; ~, _
* q' K3 H# r5 y( F* M
8 S# z1 X5 c. r: Z% O; E/ ?6 i+ j转换一下:2 W9 G p0 R- \) W' ]
, m2 j8 d5 \7 {( i: V& Y3 H$ \' c
2 q/ T8 V8 ^: M4 d3 ^
5 X5 C/ T, k( _select b’01110010′4 D4 o3 {- X0 ?5 X. ~
. E4 o, G5 a# C9 q* u. P m
6 ]# B2 e8 \/ t& G# A/ ]( F# S0 L' r7 _
查询结果
7 u3 ?/ Z7 ?3 h3 j- ?7 P. ^
7 t: t" Q9 B6 M: y( P7 b # l5 U0 F! A$ w+ r. \( J
! T2 e# C3 c5 z( Z. Z+ P! ?4 B
+————-+
! G* v$ |( X9 Q8 L( j4 f
4 F3 j6 f6 g9 @( r| b’01110010′ |
9 ~9 y4 B8 x0 \1 U" z
! B( `3 l6 ~! c# v$ \+————-+! B! Z# V9 r2 Z* ]0 G
) ^7 M3 p; Y6 t8 t4 k0 H
| r |: `2 t# a; t2 |) Z$ ^
V. d, H) d, ]% x
+————-+
( F, n$ k# [3 h: f- R6 c' p
& ]. ^8 u# }" y3 n3 o9 }0 F7 k7 k1 row in set (0.00 sec). u. ~' b5 {+ r
$ K& d7 P+ J9 O# L p4 ] 0 U% h0 E8 G0 S j
+ c0 X* x- E* G! C这样我们就获得了user()的第一位.其它位依此类推
) Q# ^) z0 X/ j9 W
2 w! e2 g! G! L# r5 { |