2012-05-15 7 views
9

En una columna DECIMAL (M, D) MySQL ofrece la opción para que el rango de D sea de 0 a 30.¿Cuál es el uso de DECIMAL (x, 0)?

¿Hay algún motivo sutil que me falta para la opción 0? ¿No es un decimal sin nada después del punto decimal un entero?

¿Cuándo y por qué querría especificar un DECIMAL que no tenga lugares decimales?

+0

Dado el problema que tenía al leer y comprender la pregunta en primer lugar, no estoy de acuerdo. Gracias por borrar tu 'respuesta'. – Leo

+0

Bien, esos comentarios previos se refieren a http://stackoverflow.com/users/166390/pst quien entró aquí no leyó mi pregunta, pisoteó todo, editó el título, borró sus pistas y se escapó. – Leo

+0

Esta pregunta ha sufrido una cantidad sorprendente de ediciones, la mayoría de las cuales han hecho que sea más difícil de leer y un número similar lo restaure. Si debe agregar su propio trozo de carnicería, como mínimo, no corrija mi gramática original en inglés con la versión incorrecta del segundo idioma. – Leo

Respuesta

8

El rango de números del DECIMAL type es mucho mayor que para un INTEGER o BIGINT. El mayor número que puedes almacenar en un DECIMAL (65, 0) es de 65 nueves. El número más grande en un BIGINT es 18446744073709551615.

DECIMAL (x, 0) es a menudo un poco más caro para números pequeños. Considere usar un INTEGER type definido si sus números están en el rango de uno de ellos.


El requisito de almacenamiento en bytes de un decimal (x, 0) campo depende de la x acuerdo con esta fórmula:

Storage = x/9 + Leftover 
Leftover = round_up((x % 9)/2) (i.e., about half of the leftover digits) 

Usted puede leer más sobre el almacenamiento requirements for numeric types en el manual de MySQL y comparar para ti.

+1

Entonces, ¿qué estás diciendo es que es una manera de engañar a un VERYBIGINT? – Leo

+0

Sí, supongo que sí. Tenían el tipo de datos para almacenar números a un número específico de dígitos y luego solo permitían que la parte de decimales fuera cero. Probablemente sea trivial tener 'D> = 0' cuando ya tienes' D> = 1', y alguien puede necesitarlo algún día. Sin embargo, tenga en cuenta que los cálculos en el campo pueden ser más lentos que en los campos INTEGER; No lo he intentado, pero tengo la corazonada de que debería averiguarlo antes de hacer cálculos pesados ​​utilizando valores DECIMAL grandes. –

1

En un Biging usted solo puede almacenar un dígito que no sea mayor que 18 446 744 073 709 551 615. Esto es de 20 dígitos, pero en un DECIMAL puede especificar hasta 65 dígitos para almacenar. También con int no puede restringir directamente el número de dígitos a un número bajo (por ejemplo, a uno). Por lo tanto, es más flexible y si necesita expandirlo en una base de datos existente, es más fácil.

+1

¿Qué quiere decir con "ampliarlo en una base de datos existente"? También tenga en cuenta que para números más pequeños ya hay tipos INTEGER definidos (TINYINT, SMALLINT, ...) que usan la misma cantidad de almacenamiento (o menos en algunos casos, por ejemplo, si su número es siempre <255, necesitará 1 byte con TINYINT o 2 bytes con DECIMAL (3, 0). Sin embargo, entiendo el valor posible de las restricciones impuestas por DECIMAL. –

2

Además de permitir a almacenar los valores más grandes que BIGINT, puede utilizar DECIMAL(x,0) si quieres:

  • permiten valores en el rango -9, ... , +9: utilizar DECIMAL(1,0) (utiliza 1 byte)

  • permitir valores en el rango -99, ... , +99: use DECIMAL(2,0) (utiliza 1 byte)

  • permiten valores en el rango -999, ... , +999: utilizar DECIMAL(3,0) (utiliza 2 bytes)

  • permitir que los valores en el rango -9999, ... , +9999: utilizar DECIMAL(4,0) (utiliza 2 bytes)

...

  • permitir que los valores en el rango -999999999, ... , +999999999 : use DECIMAL(9,0) (utiliza 4 bytes)

... etc (hasta DECIMAL(65,0) que usa 29 bytes)

+0

Sin embargo, esto realmente no explica la pregunta. ¿Por qué querrías esto? ¿Es por las restricciones? en número de dígitos? Porque para el almacenamiento TINYINT, SMALLINT, etc., son al menos tan buenos o mejores. –

Cuestiones relacionadas