MySQL查询从表中select有效的域

简单的表域:int id,varchar name

表格必须包含有效的域名(我们会认为域名是有效的,如果它是在窗体中.*\.[\w\d_-]{2,3}

当然,我们不需要对DNS进行validation。 运行该SQL:

 SELECT * FROM domain WHERE name NOT REGEXP '.*\.[\w\d_-]{2,3}' 

给我一些不可预知的结果(对我来说绝对符合条件的域)

例:

 95323 vandtech.dk 95324 vanee.demon.co.uk 95325 vanens.com 95326 vanger.nl 95327 vangstein.no 95328 vanhoorn-kiel.de 95329 vanityeventi.com 95330 vanloosen.de 

但不会返回无效的条目,例如:

 1.396.041 _. 1.396.042 _.75 1.396.043 _.ca 1.396.044 _23.com 

有人可以解释我在做什么错误的正则expression式

看起来你正在使用Perl风格的正则expression式,但MySQL不理解这些。 您可以用[:digit:]replace\d 。 查看MySQL 5.1参考手册的§11.4.2 。

我不是100%确定,但我认为你的正则expression式看起来像:

 .*\.[[:alnum:][:digit:]_-]{2,3} 

尽pipe说实话,我认为各个阶层之间有一些重叠。 也许它可以更简单地表示:

 .*\.[[:alnum:]_-]{2,3} 

我也应该指出,下划线_在域名的任何部分都是无效的。