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

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

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 2,909 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/

8 Comentarios

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: