¿Cuál es el mejor tipo de datos SQL para valores de moneda? Estoy usando MySQL pero preferiría un tipo de base de datos independiente.
mysql
sql
sqldatatypes
Brian Fisher
fuente
fuente
Respuestas:
Algo así
Decimal(19,4)
generalmente funciona bastante bien en la mayoría de los casos. Puede ajustar la escala y la precisión para adaptarse a las necesidades de los números que necesita almacenar. Incluso en SQL Server, tiendo a no usar "money
" porque no es estándar.fuente
(19,4)
lugar de(19,2)
?Lo único que debe tener en cuenta es que si migra de una base de datos a otra, puede encontrar que DECIMAL (19,4) y DECIMAL (19,4) significan cosas diferentes
( http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html )
fuente
También es importante calcular cuántos decimales pueden ser necesarios para sus cálculos.
Trabajé en una aplicación de precio de acciones que requería el cálculo del precio de un millón de acciones. El precio de la acción cotizada tuvo que almacenarse con 7 dígitos de precisión.
fuente
La respuesta de Assaf de
Suena frívolo, pero en realidad es pertinente.
Solo hoy tuvimos un problema en el que no se pudo insertar un registro en nuestra tabla de tarifas, porque una de las columnas (GrossRate) está configurada en decimal (11,4), y nuestro departamento de productos acaba de obtener un contrato para habitaciones en algún resort increíble en Bora Bora, que se venden por varios millones de francos del Pacífico por noche ... algo que nunca se anticipó cuando el esquema de la base de datos se diseñó hace 10 años.
fuente
Para las aplicaciones de contabilidad es muy común almacenar los valores como enteros (algunos incluso llegan a decir que es la única forma). Para tener una idea, tome el monto de las transacciones (supongamos $ 100.23) y multiplique por 100, 1000, 10000, etc. para obtener la precisión que necesita. Entonces, si solo necesita almacenar centavos y puede redondear hacia arriba o hacia abajo de manera segura, simplemente multiplique por 100. En mi ejemplo, eso haría que 10023 sea el número entero para almacenar. Ahorrará espacio en la base de datos y comparar dos enteros es mucho más fácil que comparar dos flotantes. Mis $ 0.02.
fuente
DECIMAL
? Debería tener mucho cuidado al traducir siempre centavos, molinos o molinos a dólares, en los momentos apropiados.entrada súper tardía pero GAAP es una buena regla general.
Fuente: Mejor tipo de datos para almacenar valor monetario en MySQL
fuente
Podría usar algo como
DECIMAL(19,2)
por defecto para todos sus valores monetarios, pero si alguna vez solo almacena valores inferiores a $ 1,000, eso será un desperdicio de valioso espacio en la base de datos.Para la mayoría de las implementaciones,
DECIMAL(N,2)
sería suficiente, donde el valor deN
es al menos el número de dígitos antes.
de la mayor suma que alguna vez espere que se almacene en ese campo+ 5
. Entonces, si nunca espera almacenar valores superiores a 999999.99,DECIMAL(11,2)
debería ser más que suficiente (hasta que las expectativas cambien).Si desea cumplir con los GAAP , puede ir con
DECIMAL(N,4)
, donde el valor deN
es al menos el número de dígitos antes.
de la mayor suma que espera que se almacene en ese campo+ 7
.fuente
Depende de la naturaleza de los datos. Necesitas contemplarlo de antemano.
Mi caso
¿Por qué (M, 4)?
Compensación
Extremo compatible
Si bien MySQL le permite usar el decimal (65,30), 31 para la escala y 30 para la precisión parecen ser nuestros límites si queremos dejar abierta la opción de transferencia.
Máxima escala y precisión en los RDBMS más comunes:
6 , 7 , 8 , 9
Razonable Extremo
Tendemos a decir "sí, claro ... no necesitaré esas figuras locas". Bueno, los zimbabuenses solían decir eso también. No hace mucho tiempo.
Imaginemos que necesita registrar una transacción de 1 millón de dólares en dólares zimbabuenses (tal vez sea poco probable hoy, pero ¿quién sabe cómo será esto dentro de 10 años a partir de ahora?).
fuente
Aunque esto puede ser tarde, pero será útil para alguien más. De mi experiencia e investigación he llegado a conocer y aceptar el decimal (19, 6). Eso es cuando trabajo con php y mysql. cuando se trabaja con gran cantidad de dinero y tipo de cambio
fuente