tipos - tipo de datos mysql para precios
El mejor tipo de datos para almacenar valores monetarios en MySQL (10)
Quiero almacenar muchos registros en una base de datos MySQL. Todos ellos contienen valores monetarios. Pero no sé cuántos dígitos se insertarán para cada uno.
¿Qué tipo de datos tengo que usar para este propósito?
VARCHAR o INT (u otros tipos de datos numéricos)?
Utilizamos double
.
*jadear*
¿Por qué?
Porque puede representar cualquier número de 15 dígitos sin restricciones sobre dónde se encuentra el punto decimal . Todo para un mísero 8 bytes!
Por lo que puede representar:
-
0.123456789012345
-
123456789012345.0
... y cualquier cosa en el medio.
Esto es útil porque estamos tratando con monedas globales , y el double
puede almacenar los diversos números de lugares decimales que probablemente encontraremos.
Un solo campo double
puede representar 999,999,999,999,999s en yenes japoneses, 9,999,999,999,999.99s en dólares estadounidenses e incluso 9,999,999.99999999s en bitcoins
Si intenta hacer lo mismo con el decimal
, necesita el decimal(30, 15)
que cuesta 14 bytes.
Advertencias
Por supuesto, usar el double
no está exento de advertencias.
Sin embargo, no es una pérdida de precisión, como algunos tienden a señalar. Si bien el double
sí puede no ser exacto internamente al sistema base 10 , podemos hacerlo exacto al redondear el valor que extraemos de la base de datos a sus decimales significativos. Si es necesario eso es. (p. ej., si se va a emitir y se requiere una representación de base 10).
Las advertencias son que, cada vez que realicemos aritmética con él, debemos normalizar el resultado (redondeando a sus decimales significativos) antes de:
- Realizando comparaciones en él.
- Escribiéndolo de nuevo en la base de datos.
Otro tipo de advertencia es, a diferencia del decimal(m, d)
donde la base de datos evitará que los programas inserten un número con más de m
dígitos, no existen tales validaciones con el double
. Un programa podría insertar un valor ingresado por el usuario de 20 dígitos y terminará siendo grabado en silencio como una cantidad inexacta.
Dado que el dinero necesita una representación exacta, no use tipos de datos que sean aproximados como float
. Puede usar un tipo de datos numérico de punto fijo para eso
decimal(15,2)
-
15
es la precisión (longitud total del valor incluyendo decimales) -
2
es el número de dígitos después del punto decimal
Ver los tipos numéricos de MySQL :
Estos tipos se utilizan cuando es importante preservar la precisión exacta, por ejemplo, con datos monetarios .
De hecho, esto se basa en las preferencias del programador. Personalmente uso: numeric(15,4)
para cumplir con los Principios de contabilidad generalmente aceptados ( GAAP ) .
Depende de su necesidad.
Usando DECIMAL(10,2)
generalmente es suficiente, pero si necesita valores un poco más precisos, puede establecer DECIMAL(10,4)
.
Si trabajas con grandes valores reemplaza 10
por 19
.
En el momento en que se hizo esta pregunta, nadie pensó en el precio de Bitcoin. En el caso de BTC, probablemente es insuficiente utilizar DECIMAL(15,2)
. Si el Bitcoin aumentará a $ 100,000 o más, necesitaremos al menos DECIMAL(18,9)
para admitir las criptomonedas en nuestras aplicaciones.
DECIMAL(18,9)
ocupa 12 bytes de espacio en MySQL ( 4 bytes por 9 dígitos ).
Intenta usar
Decimal(19,4)
Esto generalmente funciona con todos los demás DB también
Multiplica 10000 y almacena como BIGINT, como "Moneda" en Visual Basic y Office. Consulte https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
Prefiero usar BIGINT
, y almacenar los valores multiplicándolos por 100 , para que se conviertan en enteros.
Por ejemplo, para representar un valor de moneda de 93.49
, el valor se almacenará como 9349
, mientras se muestra el valor que podemos dividir por 100 y mostrar. Esto ocupará menos espacio de almacenamiento.
Precaución:
En general, no realizamos la multiplicación decurrency * currency
, en caso de que lo hagamos, dividimos el resultado con 100 y almacenamos, para que vuelva a la precisión adecuada.
Puedes usar DECIMAL
o NUMERIC
ambos son iguales
Los tipos DECIMAL y NUMÉRICO almacenan valores de datos numéricos exactos. Estos tipos se utilizan cuando es importante preservar la precisión exacta, por ejemplo, con datos monetarios. En MySQL, NUMERIC se implementa como DECIMAL, por lo que las siguientes observaciones sobre DECIMAL se aplican igualmente a NUMERIC. : MySQL
Ej. DECIMAL(10,2)
Si su aplicación necesita manejar valores monetarios de hasta un billón, entonces esto debería funcionar: 13,2 Si necesita cumplir con los GAAP (Principios de contabilidad generalmente aceptados), use: 13,4
Por lo general, debe sumar sus valores monetarios en 13,4 antes de redondear la producción a 13,2.