Tipo de datos de dinero de MySQL
Este tutorial presenta el tipo de datos DECIMAL(P,D)
que mejor se adapta al almacenamiento de valores monetarios en MySQL.
Tipo de datos de dinero de MySQL
Los valores monetarios necesitan la representación exacta. No necesitamos usar solo tipos de datos aproximados, por ejemplo, float
.
Para insertar datos monetarios, podemos aprovechar un tipo de dato numérico de punto fijo, por ejemplo, DECIMAL(P,D)
.
El DECIMAL(P,D)
indica que una columna puede almacenar hasta P
dígitos y D
decimales. La P
y la D
se explican después de la sintaxis.
Podemos definir una columna con el tipo de dato DECIMAL(P,D)
.
# Syntax
columnName DECIMAL(P,D)
Aquí, P
representa la precisión que muestra el número de dígitos significativos. Su rango es de 1
a 65
.
Si bien D
es una escala, habla de la cantidad de dígitos que podemos tener después del punto decimal. El rango de D
es 0
y 30
.
Al usar DECIMAL(P,D)
debe cumplir la condición que dice D<=P
; de lo contrario, obtendremos un error. Si no se especifican la P
y la D
, el número máximo de dígitos sería de 65 para la columna de tipo DECIMAL
.
El rango de una columna de tipo DECIMAL
depende de la precisión (P
) y la escala (D
). Entendámoslo creando una tabla demo
con dos atributos, ID
y MONEY
, y completando algunos datos.
Puede utilizar las siguientes consultas para hacer un seguimiento con nosotros.
Código de ejemplo:
# create a table
CREATE table demo(
ID INT NOT NULL PRIMARY KEY,
MONEY DECIMAL(12,2) NOT NULL
);
# insert data
INSERT INTO demo VALUES
(1,1254367892.50),
(2,8754367893.60),
(3,9854367895.65),
(4,9224367896.70);
# display data
SELECT * FROM demo;
Producción :
+----+---------------+
| ID | MONEY |
+----+---------------+
| 1 | 1254367892.50 |
| 2 | 8754367893.60 |
| 3 | 9854367895.65 |
| 4 | 9224367896.70 |
+----+---------------+
4 rows in set (0.00 sec)
También podemos usar las palabras clave FIXED
, DEC
o NUMERIC
en lugar de la palabra clave DECIMAL
porque todas las palabras clave mencionadas son sinónimos de DECIMAL
. Vea el siguiente ejemplo como demostración.
Código de ejemplo:
# create a table
CREATE table demo1(
ID INT NOT NULL PRIMARY KEY,
MONEY FIXED(12,2) NOT NULL
);
# insert data
INSERT INTO demo1 VALUES
(1,1254367892.50),
(2,8754367893.60),
(3,9854367895.65),
(4,9224367896.70);
# display data
SELECT * FROM demo;
Producción :
+----+---------------+
| ID | MONEY |
+----+---------------+
| 1 | 1254367892.50 |
| 2 | 8754367893.60 |
| 3 | 9854367895.65 |
| 4 | 9224367896.70 |
+----+---------------+
4 rows in set (0.00 sec)
Al igual que INT
, podemos usar los atributos ZEROFILL
y UNSIGNED
del tipo de datos DECIMAL
. Utilizando el atributo UNSIGNED
, el campo de tabla de tipo DECIMAL(P,D) UNSIGNED
no puede tomar valores negativos.
Por ejemplo, la tabla creada con la siguiente consulta no acepta el valor negativo para el campo DINERO
.
Código de ejemplo:
# create a table
CREATE table demo2(
ID INT NOT NULL PRIMARY KEY,
MONEY DECIMAL(12,2) UNSIGNED NOT NULL
);
Usando el atributo ZEROFILL
, MySQL rellena los valores de resultado con 0 hasta el ancho especificado por una definición de columna.
Recuerde, MySQL agrega UNSIGNED
automáticamente si usamos el atributo ZEROFILL
. Podemos comprobarlo usando DESCRIBE tableName;
consulta.
Vea el siguiente código como ejemplo.
# create a table
CREATE table demo3(
ID INT NOT NULL PRIMARY KEY,
MONEY DECIMAL(12,2) ZEROFILL NOT NULL
);
# describe a table
DESCRIBE demo3;
Producción :
+-------+---------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------------------+------+-----+---------+-------+
| ID | int | NO | PRI | NULL | |
| MONEY | decimal(12,2) unsigned zerofill | NO | | NULL | |
+-------+---------------------------------+------+-----+---------+-------+
2 rows in set (0.26 sec)
Recuerda siempre que el DECIMAL(P)
equivale al DECIMAL(P,0)
, y el DECIMAL
equivale al DECIMAL(P,0)
. No tendremos una parte decimal (parte fraccionaria) usando DECIMAL(P,0)
.
Las implementaciones DECIMAL(P)
y DECIMAL(P,0)
nos permiten decidir el valor de P
. El valor por defecto de P
es 10 si usamos la implementación por defecto DECIMAL
.
Puede consultar esto para obtener más información.