原以为纯数字、纯字母是类似的正则[0-9]、[a-z]这样的,没想到不是。MySql有自己的匹配规则。
-- 纯数字 SELECT field1 FROM tab WHERE field1 REGEXP '^[[:digit:]]+$'; -- 匹配5位字符的纯数字 SELECT field1 FROM tab WHERE field1 REGEXP '^[[:digit:]]{5}$'; -- 纯字母 SELECT field1 FROM tab WHERE field1 REGEXP '^[[:alpha:]]+$'; -- 数字+字母。这里用了一个傻方法,先取字母数字再把纯字母和纯数字排除。 SELECT field1 FROM tab WHERE field1 REGEXP '^[[:alnum:]]+$' AND field1 NOT REGEXP '^[[:alpha:]]+$' AND field1 NOT REGEXP '^[[:digit:]]+$';
这些匹配规则有张表:
Character Class Name(字符类名) | Meaning(含义) |
---|---|
alnum | Alphanumeric characters 字母数字 |
alpha | Alphabetic characters 字母 |
blank | Whitespace characters 空白字符 |
cntrl | Control characters 控制字符 |
digit | Digit characters 数字 |
graph | Graphic characters 图形 |
lower | Lowercase alphabetic characters 小写字母 |
print | Graphic or space characters 图形或空格 |
punct | Punctuation characters 标点符号 |
space | Space, tab, newline, and carriage return 空格、制表符,换行符,回车 |
upper | Uppercase alphabetic characters 大字字母 |
xdigit | Hexadecimal digit characters 十六进制数字 |
除了REEGEXP,LIKE还有些补充:
-- 匹配a开头长度为4个字符数据 SELECT field1 FROM tab WHERE field1 LIKE 'a___'; -- 匹配第2、第4位为o,长度为5个字符的数据 SELECT field1 FROM tab WHERE field1 LIKE '_o_o_';
一个下划线代表一个字符,这点跟MSSQL(Sql Server)一样。
MySql除了有LIKE之外还有RLIKE!
SELECT field1 FROM tab WHERE field1 RLIKE '^[[:digit:]]+$';
好吧,其实 RLIKE 跟 REGEXP 是一样的, 所以上面这行也是匹配纯数字。RLIKE主要是为了兼容mSQL(mini SQL)。
排序:
MySql按字母升降序排序
SELECT field1 FROM tab ORDER BY REGEXP '^[a-z]' DESC; -- 按字母升序 SELECT field1 FROM tab ORDER BY REGEXP '^[a-z]' ASC; -- 按字母降序
这里比较有趣,是相反的,DESC出来的结果是a-z升序,ASC出来的是降序。
如果是直接ORDER BY 字段 ASC,则以数字开头的会排在前面,排完再排字母开头的,如:
SELECT field1 FROM tab ORDER BY field1 ASC;
结果:
0abc
11cde
12sss
...
aaaaa
abbbb
zzzzzz
而ORDER BY 字段 DESC 则会先按字母z开始排序,最后排数字开头的,如:
SELECT field1 FROM tab ORDER BY field1 DESC;
结果:
zzzzzz
abbbb
aaaaa
...
12cde
11sss
0abc
MySql正则使用,更多请参考MySql手册(同时可能需要注意下版本号):http://dev.mysql.com/doc/refman/5.5/en/regexp.html