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 debo usar para este propósito?
VARCHAR o INT (u otros tipos de datos numéricos)?
mysql
sqldatatypes
currency
Mohammad Saberi
fuente
fuente
deimal(10,2)
es lo que uso ... puedes ajustar los valores dependiendo del tamaño esperadoRespuestas:
Dado que el dinero necesita una representación exacta, no use tipos de datos que sean solo aproximados
float
. Puede usar un tipo de datos numéricos de punto fijo para ese tipo de15
es la precisión (longitud total del valor, incluidos los decimales)2
es el número de dígitos después del punto decimalVer tipos numéricos de MySQL :
fuente
decimal
ynumeric
son lo mismo.numeric(19,4)
para registros financieros que te dan una mejor mano para jugar y adoptar nuevas solicitudes fácilmente.Puedes usar
DECIMAL
oNUMERIC
ambos son igualeses decir
DECIMAL(10,2)
Buena lectura
fuente
Prefiero usar
BIGINT
y almacenar los valores multiplicando por 100 , para que se convierta en entero.Por ejemplo, para representar un valor de moneda de
93.49
, el valor se almacenará como9349
, mientras se muestra el valor que podemos dividir por 100 y mostrar. Esto ocupará menos espacio de almacenamiento.fuente
DECIMAL
? Creas la necesidad de traducir centavos a dólares, y ay si lo olvidas en algún momento.$0.005
o$0.12345
) porque no se reducirán a un número entero después de multiplicar por 100. Si conoce la precisión de los valores, está claro que La mejor opción es usarDECIMAL
. Pero si no conoce la precisión (como en mis ejemplos) entonces ... ¿FLOAT
sería apropiado?Depende de tu necesidad.
Por lo
DECIMAL(10,2)
general, usar es suficiente, pero si necesita valores un poco más precisos, puede establecerlosDECIMAL(10,4)
.Si trabaja con grandes valores, reemplácelos
10
por19
.fuente
Si su aplicación necesita manejar valores monetarios de hasta un billón, 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 salida a 13,2.
fuente
De hecho, esto se basa en las preferencias del programador. Yo personalmente uso:
numeric(15,4)
para cumplir con los Principios de contabilidad generalmente aceptados ( GAAP ) .fuente
Intenta usar
esto generalmente funciona con cualquier otro DB también
fuente
Nosotros usamos
double
.*jadear*
¿Por qué?
Porque puede representar cualquier número de 15 dígitos sin restricciones sobre dónde está el punto decimal . ¡Todo por unos miserables 8 bytes!
Entonces puede representar:
0.123456789012345
123456789012345.0
... y cualquier cosa en el medio.
Esto es útil porque estamos tratando con monedas globales , y
double
podemos almacenar los diversos números de decimales que probablemente encontraremos.Un solo
double
campo 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.999999999s en bitcoinsSi intenta hacer lo mismo con
decimal
, necesita lodecimal(30, 15)
que cuesta 14 bytes.Advertencias
Por supuesto, el uso
double
no está exento de advertencias.Sin embargo, no es una pérdida de precisión como algunos tienden a señalar. Aunque
double
puede no ser internamente exacto al sistema base 10 , podemos hacerlo exacto redondeando el valor que extraemos de la base de datos a sus decimales significativos. Si es necesario, eso es. (por ejemplo, si se va a generar y se requiere una representación de base 10).Las advertencias son que, cada vez que realizamos operaciones aritméticas con él, necesitamos normalizar el resultado (redondeándolo a sus decimales significativos) antes de:
Otro tipo de advertencia es que, a diferencia de
decimal(m, d)
donde la base de datos evitará que los programas inserten un número con más dem
dígitos, no existen tales validacionesdouble
. Un programa podría insertar un valor ingresado por el usuario de 20 dígitos y terminará siendo registrado silenciosamente como una cantidad inexacta.fuente
1.410000000000
(doce lugares decimales significativos), pero multiplicar eso por 1,000,000,000,000 (que son 13 dígitos significativos a la izquierda del punto decimal) significa que estamos trabajando en menos un total combinado de 25 dígitos de importancia. Esto supera con creces los 15 disponibles para un doble, por lo que, en cuanto al diseño, creo que estaría muy roto.En el momento en que se hizo esta pregunta, nadie pensó en el precio de Bitcoin. En el caso de BTC, probablemente sea insuficiente para usar
DECIMAL(15,2)
. Si el Bitcoin aumentará a $ 100,000 o más, necesitaremos al menosDECIMAL(18,9)
admitir criptomonedas en nuestras aplicaciones.DECIMAL(18,9)
ocupa 12 bytes de espacio en MySQL ( 4 bytes por 9 dígitos ).fuente
Almacenar dinero
BIGINT
multiplicado por 100 o más con la razón de usar menos espacio de almacenamiento no tiene sentido en todas las situaciones "normales".DECIMAL(13,4)
DECIMAL
.DECIMAL(13,4)
representa 9 dígitos + 4 dígitos de fracción (lugares decimales) => 4 + 2 bytes = 6 bytesBIGINT
.fuente
Si se requiere cumplimiento de GAAP o necesita 4 decimales:
DECIMAL (13, 4) que admite un valor máximo de:
$ 999,999,999.9999
De lo contrario, si 2 decimales son suficientes: DECIMAL (13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
fuente
Multiplica 10000 y almacena como BIGINT, como "Moneda" en Visual Basic y Office. Ver https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
fuente