Auflösen von Gleitkomma-Diskrepanzen in MySQL-Auswahlen
Beim Ausführen einer SELECT-Anweisung mit einer WHERE-Klausel, die einen Gleitkommawert mit einer Konstante vergleicht, Benutzer können auf unerwartete Ergebnisse stoßen. Die folgende Abfrage gibt beispielsweise keine Zeilen zurück:
<code class="sql">SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31';</code>
Das Entfernen der Preisvergleichsbedingung ergibt jedoch die richtige Zeile:
<code class="sql">SELECT * FROM `table`;</code>
Diese Diskrepanz kann auf die Art und Weise zurückgeführt werden, wie MySQL damit umgeht Gleitkomma-Präzision. Während der aus der Datenbank abgerufene Wert „101,31“ anzeigt, kann er aufgrund von Ungenauigkeiten in der Gleitkomma-Arithmetik geringfügig von der tatsächlich in der WHERE-Klausel verwendeten Konstante abweichen.
Lösung: Umwandlung in DECIMAL
Um dieses Problem zu lösen, kann man die Preisspalte in der WHERE-Klausel in den Typ DECIMAL umwandeln:
<code class="sql">SELECT * FROM `table` WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);</code>
Dadurch wird sichergestellt, dass sowohl der Datenbankwert als auch die Konstante als DECIMALs dargestellt werden. Dadurch werden potenzielle Präzisionsprobleme beseitigt.
Alternative Lösung: Spaltentyp ändern
Als Alternative können Sie erwägen, den Datentyp der Preisspalte direkt in DECIMAL zu ändern. DECIMAL bietet eine höhere Präzision und Skalierbarkeit bei der Arbeit mit Geldwerten, sodass keine SELECT-Abfragen eingegeben werden müssen.
Das obige ist der detaillierte Inhalt vonWarum gibt meine MySQL-SELECT-Anweisung beim Vergleich eines Float-Werts mit einer Konstante keine Zeilen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!