2010-09-08 12 views
8

Wenn ein Preis in einer Zeile 38.03 ist, dann sollten die folgenden Sucheinschränkungen alle die Zeile zurückgeben, die das Ergebnis enthält.MySQL größer oder gleich Operator ignoriert seine oder gleich

WHERE price >= '38.02' AND price <= '38.03' (Dies funktioniert)

WHERE price >= '20' AND price <= '100' (Dies funktioniert)

WHERE price >= '38.03' AND price <= '38.03' (Das funktioniert nicht)

WHERE price >= '38.03' AND price <= '100' (Das funktioniert nicht)

WHERE price >= '38.03' (Diese doesn 't arbeiten)

WHERE price <= '38.03' (Dies funktioniert)

Der Preis wird als Float im DB gespeichert.

Also im Grunde funktioniert <= funktioniert, während >= nicht ist. Gibt es einen Grund, warum das sein könnte?

+1

Warum müssen Sie den Wert in einfache Anführungszeichen setzen? – BoltClock

+1

Ist das nicht eine Variation des klassischen Gleitkomma-Vergleichsproblems? ... Ich vergesse den Namen ... –

+3

Es mag jetzt zu spät sein, aber Preise (und Geld) sollten immer als DECIMAL-Typ gespeichert werden, niemals schwebt. http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html – msw

Antwort

23

bedenken, dass float ein fehlerhafter Datentyp ist, wenn es um Präzision geht. Wenn Sie 12 als Float darstellen, erhalten Sie 11.99999999999998 oder etwas.

'38.03' kann in Dezimal konvertiert werden, oder anderen Datentyp, der genauer ist (abhängig von RDBMS, ich bin hier allgemein), und es wird von der Float-Wert abweichen.

Float ist 32 Bit, geringe Präzision. Double funktioniert viel besser und ist 64-Bit-Datentyp. Der Dezimaldatentyp in einigen Systemen sind 128-Bit-numerische Datentypen zum Speichern sehr genauer numerischer Werte und werden normalerweise zum Bezeichnen von Geld verwendet.

Und, überspringen Sie die Gewohnheit des Vergleichs mit dem = Operator, float Werte. Floats werden für ungefähre und schnelle Berechnungen verwendet, und nur der Vergleich mit einem Bereich ist zulässig, um den Wert eines float zu überprüfen. Das gilt grundsätzlich für jedes einzelne System.

+2

+1 Ja, verwenden Sie stattdessen 'DECIMAL'. MySQL ist ziemlich gut mit denen. – BoltClock

+0

Selbst 128 Bit werden Ihnen nicht helfen, genau 0,1 auszudrücken. Geld wird am besten als ganze und gebrochene Teile als ganze Zahlen dargestellt. – duffymo

+0

@duffymo, Sie sprechen über einen festen Punkt dezimal. Es gibt 2 Arten von Dezimalstellen, und einige RDBMS haben den Datentyp 'money', der ein Festkomma-Dezimalpunkt mit 2-4 Dezimalstellen ist. – AlexanderMP

0

Wenn Sie Anführungszeichen (') verwenden, werden Ihre Variablen als Strings behandelt. Ich denke, das ist dein Problem.

Versuchen: WHERE preis> = 38,03 und Preis < = 38,03

+2

Versuchen Sie es selbst und Sie werden feststellen, dass es keinen Unterschied gibt. :) –

+0

Die obige Abfrage entspricht WHERE Preis = 38.03 –

+2

mysql> SELECT 38.03 <= 38.03; Ergebnis: 1 mysql> SELECT 38.03 <38.03; Ergebnis: 0 – Johan

Verwandte Themen