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.

  1. D no debe ser más grande que M
  2. M sólo puede tener 65 dígitos
  3. 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:

Uso de decimal en MySQL

Demostrar capacidad de decimal en MySQL o MariaDB

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


Estoy disponible para trabajar en tu proyecto o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.
Si el post fue de tu agrado muestra tu apoyo compartiéndolo, suscribiéndote al blog, siguiéndome o realizando una donación.

Suscribir por correo

Ingresa tu correo y recibirás mis últimas entradas sobre programación, open source, bases de datos y todo lo relacionado con informática

Únete a otros 7,450 suscriptores

parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

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 […]

Deja un comentario

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto: