MySQL: bevorzugter Spaltentyp für (Produkt-) Preise?

78

Was ist in MySQL der bevorzugte Spaltentyp zum Speichern des Preises eines Produkts (oder der Währungen im Allgemeinen)? Google hat mir beigebracht, dass DECIMAL of FLOAT oft verwendet wird, aber ich frage mich, welches besser ist.

Ich speichere Preise zwischen 0,01 und 25,00. Natürlich könnten auch höhere Werte möglich sein. (Hinweis: Ich frage nicht nach Copy-Pasta-Code, sondern gebe Ihnen nur weitere Informationen, die Ihnen helfen könnten, eine vollständigere Antwort zu finden.)

Vielen Dank

SolidSmile
quelle

Antworten:

85

Dezimal ist die, die ich verwenden würde

Der grundlegende Unterschied zwischen Dezimal / Numerisch und Float: Float ist der Datentyp "Ungefähre Zahl". Dies bedeutet, dass nicht alle Werte im Datentypbereich exakt dargestellt werden können. Dezimal / Numerisch ist ein Datentyp mit fester Präzision. Dies bedeutet, dass alle Werte im Datentyp reane exakt und präzise dargestellt werden können.

Das Konvertieren von Dezimal oder Numerisch in Float kann zu Genauigkeitsverlusten führen. Für die Datentypen Dezimal oder Numerisch betrachtet SQL Server jede bestimmte Kombination aus Genauigkeit und Skalierung als einen anderen Datentyp. DECIMAL (4,2) und DECIMAL (6,4) sind unterschiedliche Datentypen. Dies bedeutet, dass 11.22 und 11.2222 unterschiedliche Typen sind, obwohl dies bei float nicht der Fall ist. Für FLOAT (6) sind 11.22 und 11.2222 dieselben Datentypen.

Sheff
quelle
Vielen Dank an jdt199 und Razzie. Ich würde beide Antworten akzeptieren, aber Ihre als die vollständigste auswählen.
SolidSmile
1
@ Sheff DECIMAL (2,2) sollte DECIMAL (4,2) sein. DEZIMAL (2,4) sollte DEZIMAL (6,4) sein. Siehe dev.mysql.com/doc/refman/5.7/en/…
cgaldiolo
PrestaShop verwendet Decimal (20,2). So dezimal ist es!. github.com/PrestaShop/PrestaShop/blob/1.7.3.x/install-dev/data/…
DevWL
30

Der Feldtyp "Dezimal" ist gut.

Wenn Sie hohe Preise haben, können Sie verwenden, product_price decimal(6,2) NOT NULL,dh Sie können Preise bis zu 6 Stellen mit Dezimalpunkt vor 2 Stellen speichern.

Der maximale Wert für das Feld product_price decimal(6,2) NOT NULL,speichert den Preis bis zu 9999,99

Wenn alle Preise zwischen 0,01 und 25,00 product_price decimal(4,2) NOT NULL,liegen, ist dies gut. Wenn Sie jedoch höhere Preise haben, können Sie beliebige Werte in festlegen decimal(4,2).

Ali Nawaz
quelle
10

Ich bevorzuge INT (Preis multipliziert mit 100), das das Gleitkommaproblem in anderer Software löst.

Peter
quelle
5
Ich habe ein solches System geerbt. Es war lustig zu sehen, wie dieser Typ alle Preise multiplizierte, bevor er in der DB nach dem Preis suchte und umgekehrt. Später hatte ich genug Schmerzen, um Fehler zu fangen, bevor ich zur Dezimalstelle
überging
@ ГляОпаОпа Wie geht man das Gleitkomma-Problem mit Dezimalstellen an?
Peter
Vor dem Speichern runde ich jede Zahl auf das dritte Zeichen nach dem Punkt und verwende DECIMAL (N, 3) zum Speichern
Tebe
@ ГляОпаОпа warum überhaupt runden, wenn DB es für Sie tun wird. Das Problem beginnt, wenn Sie die Zahlen 0.3! == 0.30000000001 vergleichen. Grundsätzlich müssen Sie Zahlen jedes Mal runden, wenn Sie Zahlen subtrahieren oder addieren möchten.
Peter
Da alle Zahlungsanbieter (PSPs) auf diese Weise arbeiten, sollte dies keine schlechte Preislösung mit einer Genauigkeit von 2 Dezimalstellen sein.
Meloman
-8

Dezimal ist falsch, denn wenn Sie den Preis auf 12,99 Dezimal einstellen möchten, drehen Sie ihn auf 13,00. Dies ist also falsch, aber wenn Sie float verwenden, können Sie ihn als 12,99 speichern. Die richtige Antwort lautet also float und varchar.

Berk Kanburlar
quelle
Das ist nicht wahr.
Sneftel
Auf mehreren Ebenen falsch. Dezimal [N, 2] wird nicht gerundet, wie Sie sagen, es werden diese 2 Dezimalstellen genau beibehalten. Dafür ist es da.
Simon Tillson
Ich weiß, dass die Leute negativ abgestimmt haben, aber es stimmt immer noch, die Antwort ist FLOAT. Sie können auch überprüfen, ob die meisten Zahlungssysteme den Preis als Float sparen ... SPAREN SIE DEN PREIS ATTRIBUT ALS FLOAT!
Berk Kanburlar