2010-04-20 27 views
15

Estoy tratando de averiguar el valor máximo para un entero (firmado o no) desde una base de datos MySQL. ¿Hay alguna forma de extraer esta información de la base de datos?En SQL, ¿cómo obtengo el valor máximo para un entero?

¿Hay constantes integradas o funciones que pueda usar (ya sea SQL estándar o MySQL específicos).

En http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html enumera los valores, pero ¿hay alguna manera de que la base de datos me diga?

Lo siguiente me da MAX_BIGINT - lo que me gustaría es MAX_INT.

SELECT CAST(99999999999999999999999 AS SIGNED) as max_int; 
# max_int | 9223372036854775807 

Gracias de antemano,

+0

volver a escribir de una tabla (http://dev.mysql.com/doc/refman/ 5.0/es/numeric-types.html). Esto no cambia de ninguna manera, puedes definirlo const. – Svisstack

+1

Tenga en cuenta que tendrá diferentes valores para SIGNED v. UNSIGNED ints. – BryanH

+0

Hola, CoffeeMonster. ¿Revisaste mi respuesta? Si lo considera el correcto, verifíquelo como tal. Muy apreciado, Roland. –

Respuesta

56

en MySQL no es un truco barato para hacer esto:

mysql> select ~0; 
+----------------------+ 
| ~0     | 
+----------------------+ 
| 18446744073709551615 | 
+----------------------+ 

la tilde es la negación bit a bit. El valor resultante es un bigint. Ver: http://dev.mysql.com/doc/refman/5.1/en/bit-functions.html#operator_bitwise-invert

Para los otros sabores enteros, puede utilizar el operador BitShift derecho >> así:

SELECT ~0 as max_bigint_unsigned 
,  ~0 >> 32 as max_int_unsigned 
,  ~0 >> 40 as max_mediumint_unsigned 
,  ~0 >> 48 as max_smallint_unsigned 
,  ~0 >> 56 as max_tinyint_unsigned 
,  ~0 >> 1 as max_bigint_signed 
,  ~0 >> 33 as max_int_signed 
,  ~0 >> 41 as max_mediumint_signed 
,  ~0 >> 49 as max_smallint_signed 
,  ~0 >> 57 as max_tinyint_signed 
\G 

*************************** 1. row *************************** 
    max_bigint_unsigned: 18446744073709551615 
     max_int_unsigned: 4294967295 
max_mediumint_unsigned: 16777215 
max_smallint_unsigned: 65535 
    max_tinyint_unsigned: 255 
    max_bigint_signed: 9223372036854775807 
     max_int_signed: 2147483647 
    max_mediumint_signed: 8388607 
    max_smallint_signed: 32767 
    max_tinyint_signed: 127 
1 row in set (0.00 sec) 
+0

Esta es una forma mucho más agradable de entrenar al máximo (Big_Int). Lo que busco es max (signed) y max (unsigned). – CoffeeMonster

+0

Coffemonster, ver mi respuesta actualizada. –

+2

¿Qué pasará si MySql decide agregar una nueva versión, digamos HYPERINT (16 bytes)? ¿Esta ruptura encontrando mediumint, tinyint, smallint? Aunque entiendo que puedes encontrar el valor int más grande en ~ 0, entonces creo que buscar smallint, mediumint, tinyint by bit cambiando desde el valor máximo no es tan sabio. –

-2

No parece haber ningún constantes integradas para el suministro de estos valores. Como lo más probable es que no cambien, debe estar seguro ya sea codificándolos o estableciendo sus valores en una tabla o variable de búsqueda.

Cuestiones relacionadas