Ankündigung

Einklappen
Keine Ankündigung bisher.

Rechnen mit MqSQL und die NULL

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Rechnen mit MqSQL und die NULL

    Hallo liebes Forum!

    Jetzt habe ich mich extra hier angemeldet, um folgende Seltsamkeit mit euch zu teilen. Vielleicht hat ja irgendwer eine Idee dazu:

    Ausgangssituation sind eine Tabelle mit Geokoordinaten (ca. 90.000 Datensätze), eine Umkreissuche und Köln Porz.

    Laut meiner Tabelle liegt Köln Porz auf 50.937 Länge und 6.97788 Breite.

    Die Berechnung der Entfernung erledigt folgende Query:

    SELECT ACOS( SIN( RADIANS( 50.937 ) ) * SIN( RADIANS( 50.937 ) ) + COS( RADIANS( 50.937 ) ) * COS( RADIANS( 50.937 ) ) * COS( RADIANS( 6.97788 ) - RADIANS( 6.97788 ) ) ) *6380 AS entfernung

    In diesem Fall also von Köln Porz nach Köln Porz macht nach Adam Riese 0km - Mysql ist aber der Meinung hier kein Ergebnis liefern zu können und wirft NULL aus. Nun könnte man glauben, einer der MySQL Entwickler hätte etwas gegen Köln Porz - aber weit gefehlt. Verschiebe ich den Mittelpunkt um ca 25 Meter auf 50.9371 Länge und 6.9977881 Breite und führe die gleiche Berechnung (ohne eine Tabelle anzusprechen) aus, bekomme ich plötzlich die gewünschte 0 als Entfernung.

    Von den oben genannten 90.000 Datensätzen waren ca. 2000 betroffen, die sich alle durch eine leichte Verschiebung (anhängen einer 1 ans Ende) korrigieren ließen.

    Betroffen waren unzusammenhängende Koordinaten in D, AT und CH.

    Getestet habe ich es auf
    - Server Version: 5.1.73-log - Source distribution, Linux
    - Server Version: 5.1.73 - Source distribution, Linux
    - Server Version: 5.5.38 - MySQL Community Server (GPL), Win 7

    Kann sich hier irgendjemand dieses Phänomen erklären?

    Danke für Input und einen schönen Nachmittag!
    Markus

  • #2
    Das sind Rundungsfehler. Nimm den Ausdruck auseinader und du siehst den Fehler:
    PHP-Code:
    SELECT
            SIN
    RADIANS50.937 ) ) * SINRADIANS50.937 ) ) + COSRADIANS50.937 ) ) * COSRADIANS50.937 ) ) * COSRADIANS6.97788 ) - RADIANS6.97788 ) ),
            
    ACOSSINRADIANS50.937 ) ) * SINRADIANS50.937 ) ) + COSRADIANS50.937 ) ) * COSRADIANS50.937 ) ) * COSRADIANS6.97788 ) - RADIANS6.97788 ) ) ) 

    Zitat von http://dev.mysql.com/doc/refman/5.1/de/mathematical-functions.html
    ACOS(X)

    Gibt den Arkuskosinus von X zurück, d. h. den Wert, dessen Kosinus X ist. Gibt NULL zurück, wenn X nicht im Bereich zwischen -1 und 1 liegt.

    Kommentar


    • #3
      Hi erc!

      Etwas in der Art dachte ich mir schon. Aber vielen Dank für die Erklärung! Jetzt wird mir einiges etwas klarer.

      Kommentar

      Lädt...
      X