如何检查一个值是否是MySQL中的整数?

我发现在MySQL内部有Cast()Convert()函数从值中创build整数,但是有什么办法来检查一个值是一个整数吗? 像PHP中的is_int()就是我正在寻找的东西。

我假设你想检查一个string值。 一个不错的方法是REGEXP运算符,将string与正则expression式匹配。 简单地做

 select field from table where field REGEXP '^-?[0-9]+$'; 

这是相当快的。 如果你的领域是数字,只是testing

 ceil(field) = field 

代替。

匹配一个正则expression式。

参考以下引用http://forums.mysql.com/read.php?60,1907,38488#msg-38488

Re:MySQL中的IsNumeric()子句?
发布者:kevinclark()
date:2005年8月8日下午01:01

我同意。 这是我为MySQL 5创build的一个函数:

 CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 

这允许在开始处有一个可选的加号/减号,一个可选的小数点和其余的数字。

假设我们有字母数字字段的列有类似的条目

 a41q 1458 xwe8 1475 asde 9582 . . . . . qe84 

并且你想从这个数据库列(在这种情况下是9582)最高的数值,那么这个查询将帮助你

 SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$' 

假设数据types是varchar,这是简单的解决scheme

 select * from calender where year > 0 

如果年份为数字,则返回true否则为false

这也适用:

 CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string. 

例如

 SELECT CAST('a123' AS UNSIGNED) // returns 0 SELECT CAST('123' AS UNSIGNED) // returns 123 ie > 0 

关于什么:

 WHERE table.field = "0" or CAST(table.field as SIGNED) != 0 

testing数字和推测:

 WHERE table.field != "0" and CAST(table.field as SIGNED) = 0 

我曾尝试使用上面列出的正则expression式,但它们不适用于以下内容:

 SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ... 

以上将返回1TRUE ),意味着对上面正则expression式的string'12 INCHES'的testing返回TRUE 。 它看起来像一个基于上面使用的正则expression式的数字。 在这种情况下,因为12位于string的开头,正则expression式将其解释为一个数字。

以下将返回正确的值(即0 ),因为string以字符而不是数字开始

 SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ... 

以上将返回0FALSE ),因为string的开始是文本而不是数字。

但是,如果您正在处理以数字开头的数字和字母组合的string,则不会得到您想要的结果。 实际上,REGEXP将把该string解释为有效的数字。

要检查Mysql中的值是否为Int,我们可以使用以下查询。 这个查询将给予Int值的行

 SELECT col1 FROM table WHERE concat('',col * 1) = col; 

这适用于VARCHAR,它以数字或不以数字开头。

 WHERE concat('',fieldname * 1) != fieldname 

当你到达更大的NNNNE +号码时可能会有限制

对我来说唯一可行的是:

 CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 

从kevinclark所有其他返回无用的东西在234jk45612 inches情况下