it-swarm.com.de

Auswählen eines Floats in MySQL

Ich versuche, eine SELECT-Übereinstimmung für eine Tabelle anhand eines Bezeichners und eines Preises zu erstellen, z.

SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31';

Das Obige gibt Nullzeilen zurück. Wenn Sie das price='101.31'-Bit entfernen, wird die richtige Zeile zurückgegeben. 

Macht ein ...

SELECT * FROM `table`;

Gibt die gleiche Zeile wie oben zurück und besagt eindeutig price='101.31'. Select passt jedoch nicht dazu. Wenn Sie = in <= ändern, funktioniert dies - aber dies ist keine exakte Lösung.

Gibt es eine Möglichkeit, den MySQL-Float vor der Ausführung der Operation auf 2 Ziffern umzuwandeln, sodass die obige SELECT funktioniert (oder eine andere Lösung)?

Vielen Dank!

22
Meep3D

Casting auf eine Dezimalzahl hat für mich funktioniert:

SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);

Es kann jedoch sinnvoll sein, die Spalte price in erster Linie als DECIMAL zu definieren. DECIMAL wird im Allgemeinen als der beste Typ für den Umgang mit Geldwerten betrachtet.

38
Matt Solnit

Es funktioniert nicht, weil ein Float von Natur aus ungenau ist. Der tatsächliche Wert ist wahrscheinlich etwas wie '101.3100000000001'. Sie können ROUND () zuerst verwenden, um ihn auf zwei Stellen zu runden, oder besser noch einen DECIMAL-Typ anstelle eines Float-Objekts.

11
Eric Petroelje

Verwenden Sie niemals Schwimmwagen für Geld.

9
jcdyer

Heute bin ich auch auf die gleiche Situation gestoßen und habe mich nur durch die FORMAT-Funktion von MySQL gelöst. Sie liefert die Ergebnisse, die genau Ihrer WHERE-Klausel entsprechen.

SELECT * FROM yourtable WHERE FORMAT(col,2) = FORMAT(value,2)

Erläuterung: FORMAT('col name', precision of floating point number)

7
hmasif

Probiere folgendes aus: SELECT * FROM table WHERE price wie 101.31 ;

0
Gerson Diniz

Ich habe nach einer Lösung gesucht, aber schließlich habe ich es mit meinem vorherigen PHP number_format () gemacht, das mit der Lösung von @ hmasif zu tun hatte.

Verwenden Sie dies und Sie erhalten Ihre Float - MySQL-Übereinstimmung:

$floatmatch = number_format((float)$yourfloatvariable,5);

dabei ist 5 fünf Zeichenfolgen vom Dezimalpunkt. z.B. 7.93643