2009-10-06 51 views
27

Tengo un campo, justsomenum, de tipo decimal (3,2) en MySQL que parece tener siempre valores de 9.99 cuando inserto algo como 78.3. ¿Por qué?Los valores decimales (3,2) en MySQL siempre son 9.99

Esto es lo que mi tabla parece:

mysql> describe testtable; 
+---------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| firstname  | varchar(20) | YES |  | NULL |    | 
| lastname  | varchar(20) | YES |  | NULL |    | 
| justsomenum | decimal(3,2) | YES |  | NULL |    | 
+---------------+--------------+------+-----+---------+----------------+ 

cuando inserto algo como esto y el selecto:

mysql> insert into testtable (firstname, lastname, justsomenum) values ("Lloyd", "Christmas", 83.5); 

me sale 9.99 cuando selecciono.

mysql> select * from testtable; 
+----+-----------+-----------+---------------+ 
| id | firstname | lastname | justsomenum | 
+----+-----------+-----------+---------------+ 
| 1 | Shooter | McGavin |   9.99 | 
| 2 | Lloyd  | Christmas |   9.99 | 
| 3 | Lloyd  | Christmas |   9.99 | 
| 4 | Lloyd  | Christmas |   9.99 | 
+----+-----------+-----------+---------------+ 
4 rows in set (0.00 sec) 

Esta es MySQL 5.0.86 en Mac OS X 10.5.8.

¿Alguna idea? Gracias.

+3

+ upvote para proporcionar realmente esquemas y consultas, algo que no se ve a menudo :) –

+0

Otra buena característica de MySQL: modificar silenciosamente sus datos para que la inserción no falle ... –

Respuesta

51

El valor máximo para decimal(3, 2) es 9.99, por lo que cuando intenta insertar algo más grande que eso, está limitado a 9.99. Pruebe decimal(5, 2) u otra cosa si quiere almacenar números más grandes.

El primer argumento es el número total de dígitos de precisión, y el segundo argumento es el número de dígitos después del punto decimal.

+1

Gracias por la ayuda. Tomé decimal (m, d) para significar que no importa el valor, podría tener m lugares a la izquierda del decimal y d lugares a la derecha del decimal. – labratmatt

16

En versiones anteriores MySQL DECIMAL (3,2) significa 3 enteros a la izquierda del DP y 2 a la derecha.

Los desarrolladores de MySQL lo han cambiado así que la primera propiedad (en este caso '3') es el número completo de enteros en el decimal (9.99 son tres números) y la segunda propiedad (en este caso '2') permanece igual - la cantidad de decimales.

Es un poco confuso. Básicamente, para los campos DECIMALES, cualquier número de enteros que desee antes de que el DP necesite ser agregó al número de enteros que desee después del DP y lo configuró como su primera opción.

Entonces, como ya se ha dicho, si intenta ingresar un número mayor que el valor máximo para el campo, MySQL lo recorta para usted. El problema aquí es tu configuración de MySQL. Voy a entrar en más detalles sobre este on my blog.

+0

Good break-down, scrumpyjack. Por qué MySQL hizo este cambio en la convención me supera. Supongo que lo buscaré en google algún día. – micahwittman

+0

mencionar la regla de la versión anterior es realmente genial, ya que alguien podría encontrarla en alguna parte solo para ser engañado por el momento y descubrirla más tarde en un frustrado asombro. –

Cuestiones relacionadas