Sven Burkert: Seltsam... MySQL

Hallo,

ich habe einen Datensatz, wo der Wert der Spalte "abc" (float) genau 90.63 ist. Wenn ich nun die Anweisung

SELECT * FROM stats_users WHERE abc >= 90.63

ausführe, habe ich kein Ergebnis. Wenn ich

SELECT * FROM stats_users WHERE abc >= 90.629

ausführe, bekomme ich den richtigen Datensatz.

Ich hab doch kein Fehler in der SQL-Anweisung!?

  1. Hallo

    ich habe einen Datensatz, wo der Wert der Spalte "abc" (float) genau 90.63 ist. Wenn ich nun die Anweisung

    Wenn der Datentyp der Spalte abc float ist, so ist es absolut unmöglich, dass der in der Spalte enthaltene Wert _genau_ 90.63 ist.

    SELECT * FROM stats_users WHERE abc >= 90.63

    ausführe, habe ich kein Ergebnis. Wenn ich

    SELECT * FROM stats_users WHERE abc >= 90.629

    ausführe, bekomme ich den richtigen Datensatz.
    Ich hab doch kein Fehler in der SQL-Anweisung!?

    Deine SQL-Anweisung ist wahrscheinlich nicht fehlerhaft. Dein Tabellendesign ist möglicherweise fehlerhaft. Falls es nicht fehlerhaft ist, dann ist die Logik, die zu Deiner SQL-Anweisung führt, fehlerhaft.

    Langer Rede kurzer Sinn: Du hast ein Problem mit der Genauigkeit von Gleitpunktzahlen. Dies hat nichts mit SQL oder Datenbanken im speziellen zu tun, sondern ist eine Frage des Datentyps. Eine weiterführende Diskussion (von vielen ähnlichen) findest Du im Archiv.

    Datenbanksysteme bieten jedoch meist auch Datentypen, die exakt sind. Vielleicht wäre bei Dir DECIMAL  eher angebracht - das ist das, was ich mit fehlerhaftem Tabellendesign bezeichnete. Du hast möglicherweise den falschen Datentyp ausgewählt. Ist Float der richtige Datentyp, dann darfst Du nicht so abfragen, wie Du das vorhast. Dann ist die Logik, die zur Abfrage führt, falsch :-)

    Freundliche Grüße

    Vinzenz

    1. Ach so ist das... aber wenn ich per phpMyAdmin einen Wert in die Datenbank eintrage und die Zahl 90.63 *von Hand* eintippe und die gleiche SQL-Anweisung nochmal ausführe, habe ich das gleiche Resultat: Bei
      SELECT * FROM stats_users WHERE abc >= 90.63
      bekomme ich kein Ergebnis!

      ???

      1. Hallo Sven,

        Ach so ist das...

        ja, so ist das.

        aber wenn ich per phpMyAdmin einen Wert in die Datenbank eintrage und die Zahl 90.63 *von Hand* eintippe

        das ändert nichts daran, das in einem Float-Wert, sei es in einer Datenbank, sei es in einer x-beliebigen Programmiersprache, dieser Wert, den Du von Hand exakt eingeben kannst, nicht exakt gespeichert werden kann. Willst Du den Wert exakt speichern, so verwende DECIMAL, nicht FLOAT. Aus diesem Grund ist FLOAT in Datenbanken z.B. ein für Geldbeträge völlig ungeeigneter Datentyp.

        und die gleiche SQL-Anweisung nochmal ausführe, habe ich das gleiche Resultat: Bei
        SELECT * FROM stats_users WHERE abc >= 90.63
        bekomme ich kein Ergebnis!

        Was zu erwarten war. Lies bitte den von mir im Archivposting verlinkten Artikel. Er mag trocken sein, erklärt aber das durchaus erwartungsgemäße Verhalten von MySQL in Deinem Anwendungsfall.

        Freundliche Grüße

        Vinzenz