MySQL: ¿tipo de columna preferido para los precios de (productos)?

78

En MySQL, ¿cuál es el tipo de columna preferido para almacenar el precio de un producto (o monedas en general)? Google me aprendió que DECIMAL de FLOAT se usa a menudo, pero me pregunto cuál es mejor.

Estoy almacenando precios que van desde 0,01 hasta 25,00. Por supuesto, también podrían ser posibles valores más altos. (Nota: no estoy solicitando un código de pasta de copia, solo le estoy brindando más información que podría ayudarlo a obtener una respuesta más completa).

Gracias

SolidSmile
fuente

Respuestas:

85

Decimal es el que usaría

La diferencia básica entre Decimal / Numérico y Float: Float es el tipo de datos de número aproximado, lo que significa que no todos los valores en el rango de tipos de datos se pueden representar exactamente. Decimal / Numérico es un tipo de datos de precisión fija, lo que significa que todos los valores en el tipo de datos reane se pueden representar exactamente con precisión y escala.

La conversión de decimal o numérico a flotante puede causar cierta pérdida de precisión. Para los tipos de datos Decimal o Numérico, SQL Server considera cada combinación específica de precisión y escala como un tipo de datos diferente. DECIMAL (4,2) y DECIMAL (6,4) son tipos de datos diferentes. Esto significa que 11.22 y 11.2222 son tipos diferentes, aunque este no es el caso de float. Para FLOAT (6) 11.22 y 11.2222 son los mismos tipos de datos.

Sheff
fuente
Gracias jdt199 y Razzie, aceptaría sus dos respuestas pero eligió la suya por ser la más completa.
SolidSmile
1
@Sheff DECIMAL (2,2) debe ser DECIMAL (4,2). DECIMAL (2,4) debe ser DECIMAL (6,4). Ver dev.mysql.com/doc/refman/5.7/en/...
cgaldiolo
PrestaShop usa Decimal (20,2). ¡Así que es decimal !. github.com/PrestaShop/PrestaShop/blob/1.7.3.x/install-dev/data/…
DevWL
30

El tipo de campo "Decimal" es bueno.

Si tiene precios más altos, puede usar, product_price decimal(6,2) NOT NULL,es decir, puede almacenar precios de hasta 6 dígitos con un punto decimal antes de 2 dígitos.

El valor máximo para el campo product_price decimal(6,2) NOT NULL,almacenará el precio hasta 9999,99

Si todos los precios están entre 0,01 y 25,00, product_price decimal(4,2) NOT NULL,será bueno, pero si tendrá precios más altos, puede establecer cualquier valor en decimal(4,2).

Ali Nawaz
fuente
10

Prefiero INT (precio multiplicado por 100) que resuelve el problema de punto flotante en otro software.

Pedro
fuente
5
Heredé ese sistema, fue divertido ver cómo este tipo multiplicó todos los precios antes de hacer una búsqueda en DB basada en el precio y viceversa. Más tarde, tuve suficiente dolor para detectar errores debido a esto antes de pasar a decimal
Tebe
@ ГляОпаОпа ¿cómo se aborda el problema del punto flotante usando decimal?
Peter
antes de almacenar, redondeo cada número al tercer signo después del punto y uso DECIMAL (N, 3) para almacenar
Tebe
@ ГляОпаОпа por qué molestarse en redondear si DB lo hará por usted. el problema comienza cuando comparas números 0.3! == 0.30000000001. así que básicamente necesitas redondear números cada vez que quieras restar o sumar números.
Peter
Dado que todos los proveedores de pago (PSP) funcionan de esta manera, esta no debería ser una mala solución para el precio con una precisión de 2 decimales.
Meloman
-10

El decimal es incorrecto porque si desea establecer el precio en 12,99 decimal, gírelo a 13,00. Así que esto es incorrecto, pero si usa float, puede guardarlo como 12,99. Entonces, la respuesta correcta es float y varchar.

Berk Kanburlar
fuente
Eso no es cierto.
Sneftel
Incorrecto en varios niveles. El decimal [N, 2] no se redondeará como usted dice, conservará esos 2 lugares decimales exactamente. Para eso es.
Simon Tillson
Sé que la gente dio un voto negativo pero aún así es cierto, la respuesta es FLOAT. También puede consultar la mayoría de los sistemas de pago. Ahorre precio como flotador ... ¡AHORRE ATRIBUTO DE PRECIO COMO FLOAT!
Berk Kanburlar