如何检查一个值是否是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 ...
以上将返回1
( TRUE
),意味着对上面正则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 ...
以上将返回0
( FALSE
),因为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所有其他返回无用的东西在234jk456
或12 inches
情况下