Wie benutzt man MySQL DECIMAL?

176

Ich kann MySQLs DECIMAL nicht ganz verstehen. Ich brauche die Zeile, um eine Nummer zwischen 00.0001 und 99.9999 enthalten zu können. Wie würde ich es so strukturieren, dass es so funktioniert?

Charles Zink
quelle
4
Sie sollten wirklich die richtige Antwort akzeptieren. Die aktuell akzeptierte Antwort ist falsch.
Olhovsky
2
Bin hier gelandet und habe die Antwort gelesen, in der behauptet wird, dass DECIMAL UNSIGNED nicht möglich ist. In der neuen Antwort unten finden Sie die richtige Spezifikation dafür.
Markus AO

Antworten:

439

DOUBLE-Spalten sind nicht mit DECIMAL-Spalten identisch, und Sie werden in Schwierigkeiten geraten, wenn Sie DOUBLE-Spalten für Finanzdaten verwenden.

DOUBLE ist eigentlich nur eine Version von FLOAT mit doppelter Genauigkeit (64 Bit statt 32 Bit) . Gleitkommazahlen sind ungefähre Darstellungen von reellen Zahlen und nicht genau. Tatsächlich haben einfache Zahlen wie 0,01 keine exakte Darstellung in FLOAT- oder DOUBLE-Typen.

DECIMAL-Spalten sind exakte Darstellungen, nehmen jedoch viel mehr Platz für einen viel kleineren Bereich möglicher Zahlen ein. Um eine Spalte zu erstellen, die Werte von 0,0001 bis 99,9999 enthalten kann, wie Sie gefragt haben, benötigen Sie die folgende Anweisung

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

Die Spaltendefinition folgt dem Format DECIMAL (M, D), wobei M die maximale Anzahl von Stellen (die Genauigkeit ) und D die Anzahl der Stellen rechts vom Dezimalpunkt (die Skala ) ist.

Dies bedeutet, dass der vorherige Befehl eine Spalte erstellt, die Werte von -99,9999 bis 99,9999 akzeptiert. Sie können auch eine UNSIGNED DECIMAL-Spalte im Bereich von 0,0000 bis 99,9999 erstellen.

Für weitere Informationen zu MySQL DECIMAL sind die offiziellen Dokumente immer eine großartige Ressource.

Beachten Sie, dass all diese Informationen für Versionen von MySQL 5.0.3 und höher gelten. Wenn Sie frühere Versionen verwenden, sollten Sie wirklich ein Upgrade durchführen.

Alex Recarey
quelle
17
Hat deine Antwort gewählt. Ihre Antwort ist richtig, die andere nicht (da sie behauptet, dass "double = decimal"). DECIMAL ist ein Festkommatyp mit einem genauen Wert und seine Synonyme sind NUMERIC, DEC und FIXED. Nicht DOUBLE, da DOUBLE ein Gleitkommatyp ist, der ungefähre numerische Datenwerte darstellt. Bei Verwendung von DECIMAL (<1-65>, <0-30>) ist der erste Parameter die Anzahl der Stellen, der zweite die Anzahl der Stellen rechts vom Dezimalpunkt.
Norbert
2
Ja, du hast recht. Beachten Sie, dass dies ab MySQL 5.0.3 funktioniert, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal
1
Das Poster forderte ein Dezimalfeld mit Werten zwischen 0,0001 und 99,9999 an. Ich habe einige zusätzliche Informationen hinzugefügt, um zu verdeutlichen, dass das erstellte Feld tatsächlich Werte von -99,9999 bis 99,9999 unterstützt. Danke für die Rückmeldung! Außerdem wurde der Haftungsausschluss für die MySQL-Version hinzugefügt.
Alex Recarey
1
Sie sagten "Es gibt keine Möglichkeit, eine" vorzeichenlose "DECIMAL-Spalte zu erstellen", aber Ihr Codebeispiel zeigt "DECIMAL (6,4) UNSIGNED NOT NULL" an. Warum ist das?
Liang
3
@AlexRecarey Ich scheine in der Lage zu sein, ein DECIMAL UNSIGNED zu erstellen. und das Handbuch für MySQL 5.x stimmt zu : DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Bei negativen Werten wird ein Fehler außerhalb des Bereichs zurückgegeben. Sie können auch unsigned FLOAT und DOUBLE erstellen. Handbuch: dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO
64

Obwohl die obigen Antworten richtig erscheinen, nur eine einfache Erklärung, um Ihnen eine Vorstellung davon zu geben, wie es funktioniert.

Angenommen, Ihre Spalte ist auf gesetzt DECIMAL(13,4). Dies bedeutet, dass die Spalte eine Gesamtgröße von 13 Stellen hat, von denen 4 für die präzise Darstellung verwendet werden.

Zusammenfassend hätten Sie für diese Spalte einen Maximalwert von: 999999999.9999

Cristiano
quelle
1
beste Antwort hier
Julian Silvestri
15

In den Kommentaren gibt es korrekte Lösungen, aber um sie in einer einzigen Antwort zusammenzufassen:

Sie müssen DECIMAL (6,4) verwenden.

Dann können Sie 6 Ziffern insgesamt haben, 2 vor und 4 nach dem Dezimalpunkt (der Skala). Zumindest nach dieser .

Zoltán Hajdú
quelle
6

Die MySQL 5.x- Spezifikation für den dezimalen Datentyp lautet : DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Die obige Antwort ist falsch, wenn man sagt, dass vorzeichenlose Dezimalstellen nicht möglich sind.

Um ein Feld zu definieren, das nur vorzeichenlose Dezimalstellen mit einer Gesamtlänge von 6 Stellen zulässt, von denen 4 Dezimalstellen sind, verwenden Sie : DECIMAL (6,4) UNSIGNED.

Sie können auch vorzeichenlose (dh nicht negative) FLOAT- und DOUBLE-Datentypen erstellen.

Markus AO
quelle