Si queremos manejar dinero en MySQL, o simplemente queremos almacenar decimales sin pérdida de precisión debemos usar el tipo de dato DECIMAL.
En lo personal, la mayoría de veces olvido cuál es su sintaxis y cómo se puede usar; así que voy a explicar cómo funciona.
La sintaxis del tipo de dato es así:
DECIMAL(M, D)
En donde M
es el número de dígitos y la D
es el número de dígitos a la derecha del punto.
Con la siguiente definición:
DECIMAL(3, 2)
Creeremos que el campo podrá almacenar 3 dígitos a la izquierda del punto y 2 a la derecha (por ejemplo 250.00). Pero no, no es así.
Lo que le estamos indicando a MySQL declarando la columna de esa forma es que soporte 3 dígitos en total, y que de esos 3 tome 2 para decimales.
De modo que el número positivo más grande que podremos almacenar con esa definición será 9.99 ya que son tres dígitos y dos de ellos serán utilizados como decimales.
Debido a eso, debemos tener en mente que:
M
como decimalesAsí que si queremos almacenar algo como 250.00
debemos declarar la columna así:
DECIMAL(5, 2)
Con eso estamos diciéndole al motor: “Que este campo soporte números de hasta cinco dígitos, dos de ellos a la izquierda del punto”. Y el número positivo más grande que podremos almacenar será 999.99
Voy a poner una tabla con la definición del campo, un ejemplo del dato y el máximo número positivo que soporta
| Declaración | Ejemplo de lo que podemos almacenar | Máximo número positivo
| --- | ----------- | ----------- |
|`DECIMAL(5, 2)`| 500.00 |999.99
|`DECIMAL(7,3)`| 1500.650 |9999.999
|`DECIMAL(9,2)`| 1500000.90 |9999999.99
|`DECIMAL(5,4)`| 1.0075 |9.9999
|`DECIMAL(5,0)`| 10000 |99999
|`DECIMAL(65, 0)`| Un número de 65 dígitos sin punto decimal |Un número de 65 dígitos compuesto de nueves
|`DECIMAL(66, 0)`| Error, el máximo para M es 65 |Error, el máximo para M es 65
|`DECIMAL(65, 31)`| Error, el máximo para D es 30 |Error, el máximo para D es 30
|`DECIMAL(4,5)`| Error, D no puede ser mayor que M |Error, D no puede ser mayor que M
Ahora veamos los límites de este tipo de dato.
Veamos un ejemplo dentro del motor
Voy a crear una tabla para probar todo esto. Intentaré definir DECIMAL(66,30)
:
Nos dice que el máximo es 65
. Ahora vamos a intentar darle a D
algo mayor que 30
:
Dice lo mismo pero ahora para lo de la derecha del punto. Ahora voy a respetar los límites, y no me marcará error:
Ya creamos la tabla, se ve así:
Voy a insertar un simple 1
para que veamos toda la precisión:
Podemos observar que tiene muchos ceros. Ahora voy a ingresar un número muy grande:
Ahora intentaré guardar el número más grande con la mayor precisión decimal:
Finalmente cabe decir que también podemos usar decimales sin signo, así:
DECIMAL(5,2) UNSIGNED
Ya que si los dejamos con signo podremos almacenar desde -999.99 hasta 999.99.
Es decir, con el unsigned
sólo forzamos a que haya valores positivos, y creo (no estoy seguro) que ahorramos espacio ya que ese es el propósito de remover el signo
Y así es como podemos jugar con el tipo de dato decimal. Aquí dejo las referencias:
12.21.2 DECIMAL Data Type Characteristics
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
suponiendo que tengo que necesito almacenar con decimales exactos en mi BD como puedo hacerlo para que se me almacenen asi:
6.310
10.4557
20.1
que me respete asi talcual lo ingreso ya que he notado que me agrega mas ceros. Saludos!
Hola. Depende, ya que por ejemplo 6.310 tiene 3 decimales pero 10.4557 tiene 4 y 20.1 tiene un decimal. Debe limitar a una cantidad (por ejemplo, 4) pero si el número es mayor a esa cantidad será truncado.
También puede redondear: https://parzibyte.me/blog/2019/08/02/redondear-numeros-sql/
O si de verdad necesita guardar los números como están y no necesita hacer operaciones con ellos entonces puede guardarlos como cadena.
Justo lo que estaba buscando.
¡Gracias todo muy claro!
Gracias resolviste mis dudas
Si el artículo le ha ayudado le invito a compartirlo. Saludos!
esta super entendible !! gracias
Muy bueno, sencillo y claro, se agradece que todavia exista gente con ganas de enseñar.
Abrazo.
Muchas gracias por el aporte, me sacaste de una gran duda.
Es un placer ayudar. Te invito a seguirme en mis redes sociales
Saludos :)
Muy bien explicado, gracias por tu tiempo y aporte