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.
Sintaxis
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.
Error común
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.
Explicación
Debido a eso, debemos tener en mente que:
- M: El número de dígitos que puede soportar el campo
- D: El número de dígitos que se toman de
M
como decimales
Así 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
Ejemplos
Voy a poner una tabla con la definición del campo, un ejemplo del dato y el máximo número positivo que soporta
Límites
Ahora veamos los límites de este tipo de dato.
- D no debe ser más grande que M
- M sólo puede tener 65 dígitos
- D sólo puede tener 30 dígitos (de los 65 que tiene M como máximo)
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:
Y lo ha guardado correctamente
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
11 Comentarios
kenan · febrero 20, 2023 a las 10:48 am
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!
parzibyte · febrero 20, 2023 a las 11:09 am
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.
Elio Castro · noviembre 8, 2022 a las 12:11 pm
Justo lo que estaba buscando.
¡Gracias todo muy claro!
Ron · julio 15, 2021 a las 8:55 am
Gracias resolviste mis dudas
parzibyte · julio 15, 2021 a las 11:12 am
Si el artículo le ha ayudado le invito a compartirlo. Saludos!
Félix Castro · noviembre 28, 2019 a las 7:56 pm
esta super entendible !! gracias
Julian · septiembre 28, 2019 a las 2:17 pm
Muy bueno, sencillo y claro, se agradece que todavia exista gente con ganas de enseñar.
Abrazo.
Cristian Ferney Arboleda Valdes · agosto 13, 2019 a las 3:07 pm
Muchas gracias por el aporte, me sacaste de una gran duda.
parzibyte · agosto 13, 2019 a las 4:41 pm
Es un placer ayudar. Te invito a seguirme en mis redes sociales
Saludos 🙂
Mario Delgado · abril 18, 2019 a las 6:58 pm
Muy bien explicado, gracias por tu tiempo y aporte
Castear valores en MysQL - Parzibyte's blog - El blog de Luis Cabrera · junio 6, 2018 a las 2:11 pm
[…] invito a leer este post sobre decimales para entender mejor la […]