Como faço para verificar se um valor é um inteiro no MySQL?

Eu vejo que dentro do MySQL existem as funções Cast() e Convert() para criar inteiros a partir de valores, mas existe alguma maneira de verificar se um valor é um inteiro? Algo como is_int() no PHP é o que eu estou procurando.

Eu suponho que você queira verificar um valor de string. Uma boa maneira é o operador REGEXP, combinando a string com uma expressão regular. Simplesmente fazer

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

isso é razoavelmente rápido. Se o seu campo é numérico, apenas teste para

 ceil(field) = field 

em vez de.

Combine com uma expressão regular.

cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488 como citado abaixo:

Cláusula IsNumeric () no MySQL ??
Postado por: kevinclark ()
Data: 08 de agosto de 2005, 13:01

Concordo. Aqui está uma function que criei para o MySQL 5:

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

Isso permite um sinal de mais ou menos opcional no início, um ponto decimal opcional e os demais dígitos numéricos.

Suponha que temos coluna com campo alfanumérico tendo inputs como

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

e você quer maior valor numérico desta coluna db (neste caso, é 9582), então esta consulta irá ajudá-lo

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

Aqui está a solução simples para isso, assumindo que o tipo de dados é varchar

 select * from calender where year > 0 

Ele retornará verdadeiro se o ano for numérico mais falso

Isso também funciona:

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

por exemplo

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

Para verificar se um valor é Int no Mysql, podemos usar a seguinte consulta. Esta consulta fornecerá as linhas com valores Int

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

Sobre o quê:

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

para testar por numérico e o corrolary:

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

Eu tentei usar as expressões regulares listadas acima, mas elas não funcionam para o seguinte:

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

O acima retornará 1 ( TRUE ), significando que o teste da string ’12 INCHES ‘contra a expressão regular acima, retorna TRUE . Parece um número baseado na expressão regular usada acima. Neste caso, como o 12 está no início da string, a expressão regular o interpreta como um número.

O seguinte retornará o valor correto (isto é, 0 ) porque a string começa com caracteres em vez de dígitos

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

O acima retornará 0 ( FALSE ) porque o início da string é texto e não numérico.

No entanto, se você estiver lidando com seqüências de caracteres que tenham uma combinação de números e letras que começam com um número, você não obterá os resultados desejados. REGEXP irá interpretar a string como um número válido, quando na verdade não é.

O melhor que eu poderia pensar em uma variável é um int É uma combinação com as funções do MySQL CAST() e LENGTH() .
Esse método funcionará em tipos de dados strings, inteiros, duplos / flutuantes.

 SELECT (LENGTH(CAST([data] AS UNSIGNED))) = (LENGTH([data])) AS is_int 

veja a demonstração http://sqlfiddle.com/#!9/ff40cd/44

Isso funciona bem para VARCHAR, onde começa com um número ou não ..

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

pode ter restrições quando você chegar aos maiores NNNNE + – números

para mim, a única coisa que funciona é:

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

de kevinclark todos os outros retornam coisas inúteis para mim no caso de 234jk456 ou 12 inches