Zurück   Flashforum > Flash und Server > PHP und MySQL

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 18-01-2012, 15:01   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Korrektes Format für Nachkommazahlen in MySQL DB?

Hallo zusammen.

Ich habe eine bestehende Datenbank und dort ein paar Spalten die ich als FLOAT definiert habe. Es befinden sich unter anderem Werte wie "1742.44" in dieser Spalte.
Normalerweise sollte ich dann ja nach dem Wert suchen können?! Ich bekomme allerdings immer ein leeres Ergebnis wenn die Spalte FLOAT ist...
Mit TEXT funktioniert es zwar aber ich bin auf die BETWEEN-Funktion angewiesen.
Muss ich evtl. etwas bei der Definition der Spalte berücksichtigen?

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Alt 18-01-2012, 16:25   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
wäre jetzt trivial, aber du vergleichst doch hoffentlich number mit number?
zeig mal deinen sql-befehl.

http://dev.mysql.com/doc/refman/5.1/...operators.html
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (18-01-2012 um 16:28 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 18-01-2012, 17:03   #3 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Hallo.

Ich suche über die PHPMyAdmin-Suche welche folgende Abfrage ausspuckt:

PHP-Code:
SELECT *
FROM `produkte`
WHERE `laenge` = 1742.44 
Das findet den Wert nicht. Wird der Wert in einfachen Anführungszeichen geschrieben, wird er auch gefunden:
PHP-Code:
SELECT FROM `produkteWHERE `laenge`LIKE '1742.44' 
Aber ich glaube das ich ein Problem mit der BETWEEN-Funktion habe:

Folgende Suchanfrage geht nicht:
PHP-Code:
SELECT FROM `produkteWHERE `laengeBETWEEN '1346.26' AND '1346.26' 
wogegen
PHP-Code:
SELECT FROM `produkteWHERE `laengeBETWEEN '1000' AND '1000' 
klappt. Wenn ich den zweiten Wert bei der vorletzten Abfrage etwas höher mache (z.B. 1350) wird der korrekte Wert gefunden.

Laut den Docs sollte das auch bei der ersten BETWEEN-Abfrage eine 1 zurückgegeben werden falls so ein wert vorhanden ist:
PHP-Code:
Wenn expr größer oder gleich min und expr kleiner oder gleich max istgibt BETWEEN 1 zurückandernfalls 0. 
Ich habe es auch so getestet:
PHP-Code:
SELECT FROM `produkteWHERE `laenge` >= '1346.26' AND `laenge` <= '1346.26' 
=> kein ergebnis

PHP-Code:
SELECT FROM `produkteWHERE `laenge` >= '1346.26' AND `laenge` <= '1346.27' 
=> korrektes Ergebnis (habe die letzte Zahl um 0.01 erhöht)

Komische Sache

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Alt 18-01-2012, 17:17   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
hmmm, kennst du die zwachtel? die liegt genau zwischen zieben und acht.

SELECT * FROM `produkte` WHERE `laenge` BETWEEN '1346.26' AND '1346.26'
welcher wert soll denn deiner meinung nach zwischen '1346.26' und '1346.26' liegen?
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 18-01-2012, 17:49   #5 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Laut den Docs genau dieser: 1346.26
Korrigiere mich wenn ich falsch liege, aber größer gleich und kleiner gleich mit dem identischen Wert ergibt diesen wert?!
Und mit einer geraden Zahl klappt es ja (siehe oben das Beispiel mit 1000).
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Alt 18-01-2012, 20:37   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
ja du hast recht! aber man sollte nicht alles glauben, nur weils auf einer internetseite steht ;-)
was soll ich sage? die programmierer halt.

dein trick mit 1000 kann nicht wirklich stimmen? da computer binär arbeiten sieht die 1000 und die 1346.26 für den computer etwas anders aus und keineswegs 'gerade'. probiere mal:
.. BETWEEN '1000.0' AND '1000.0'

ich denke mir das halt so:
wenn man werte gruppieren will in einer breite von z.b. 10
dann würde nach dieser definition die 20 in die gruppe 10..20 und in die gruppe 20..30 gehören. das gehört sich einfach nicht ;-)
für mich macht min <= x < max mehr sinn (siehe auch INTERVAL).

teste halt vorher, ob min == max ist, dann kannst du diesen sonderfall ressourcensparender teste.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (18-01-2012 um 20:54 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 19-01-2012, 06:52   #7 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Für mich macht die Abfrage durchaus Sinn. Der Anwender kann per Slider, der zwei Thumbs besitzt, aus bestehenden Werten eine Eingrenzung vornehmen. Dabei ist die Grenze immer ein existierender wert (z.B. min 1732.23 und max 2055).
Aus diesem Grund müssen die zwei Grenzwerte auch in den Ergebnissen auftauchen (die ich aus Preformancegründen erst nach der Filterung komplett nachlade)

Zu dem Thema mit den BETWEEN und 1000:
PHP-Code:
SELECT FROM `produkteWHERE `laengeBETWEEN '1000.0000' AND '1000.0000' 
=> funktioniert auch (habe von einer bis zu 4 Nachkommastellen getestet)

Jetzt habe ich mir gedacht, da die Chance, dass sich zwei Werte in der zweiten Nachkommastelle unterscheiden gegen Null geht, dass ich den max Wert einfach um 0.01 erhöhe:
PHP-Code:
SELECT *
FROM `produkte`
WHERE `laenge`
BETWEEN '1346.26'
AND '1346.26' 0.01 
=> Funktioniert mit dieser Zahl

ABER: Wenn ich eine andere Nachkommastelle habe funktioniert es nicht:
PHP-Code:
SELECT *
FROM `produkte`
WHERE `laenge`
BETWEEN '1742.44'
AND '100000' 
In der Abfrage habe ich testhalber bis 10000 gesucht. Das gibt mir alle Daten OHNE die 1742.44 aus...

Wenn ich die 1742.44 z.b. auf 1742.31 ändere, funktioniert es mit den +0.01

Soweit meine Tests es zeigen liegt es an der .44
Das ist doch doof... Notfalls muss ich deswegen auf Integer gehen und in Flash oder PHP die Nachkommastellen erzeugen

Ich werde mal auf dem Produktivserver die gleichen Tests durchführen. Hoffentlich ist es dort nicht der Fall (diesen kann man evlt. nicht Anpassen, je nach dem an was es liegt)

MfG Monk

EDIT: Auf dem Produktivserver ist genau das gleiche Verhalten zu beobachten.

EDIT 2: Anscheinend funktioniert es, wenn man den Min-Wert um -0.01 verringert und den Max-Wert um +0.01 erhöht. Ich muss dazu aber noch weitere Testsläufe durchführen
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6

Geändert von dr monk (19-01-2012 um 07:11 Uhr) Grund: Hinzufügen des EDIT + EDIT 2
dr monk ist offline   Mit Zitat antworten
Alt 19-01-2012, 09:35   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
Zitat:
Zitat von dr monk Beitrag anzeigen
.. wenn man den Min-Wert um -0.01 verringert und den Max-Wert um +0.01 erhöht ..
also (vielleicht) unbestitten stimmt da was nicht. und du könntest bei der firma (?) sql mal nachfragen?

rein von der logig her (bzw. was man für logisch hält ;-) müsste es nach der beschreibung funktioniere.
unterschiede könnte es durch unterschiedliche konvertierungen also integer und float (dennoch extrem unwahrscheinlich). aber float/ float kann nicht anders sein, auch wenn du einen anderen float-wert addierst.

die sache beschäftigt übrigens auch andere. internetsuche:
sql between inclusive or exclusive
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (19-01-2012 um 09:36 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 19-01-2012, 10:37   #9 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Ich habe mir mal bei Google ein paar Sachen unter dem Suchbegriff angesehen. Dort heißt es ja auch überall inklusive.

Und ich hatte meine Abfragen ja auch mit >= ... <= getestet gehabt -> mit dem gleichen Problem. Es geht ja auch nicht (mehr) darum ob es inklusive oder exklusive ist. Nur woran es liegt, dass manche Nachkommastellen nicht funktionieren (andere dagegen schon).

Ich werde mich mit dem Umstand vorerst zufrieden geben und mein offline Wiki dementsprechend ergänzen. Und falls ich doch mal zu viele Werte haben sollte, die sich nur in der zweiten Nachkommastelle unterscheiden, werde ich einfach alle Werte in der DB um den Faktor 10 vergrößern und das Problem in Flash/PHP beheben.

Bei den Servern handelt es sich denn um XAMPP-Server (unterschiedliche Versionen / Einstellungen). Es wäre schon interessant ob das Problem auch bei anderen (neueren?) Versionen von MySQL/XAMPP auftreten. Die entsprechenden Beispiele dazu sind ja weiter oben vorhanden (falls es wer mal bei sich testen wollte)

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Flash CS3] korrektes Ansprechen king_konis Flash Einsteiger 1 29-05-2009 21:44
Korrektes Ansprechen aller Instanzen eines MC chrissy810 ActionScript 2 6 25-09-2007 11:35
MYSQL format fuer eine zelle mit 3+ ids nxfxcom PHP und MySQL 7 10-01-2005 06:27
korrektes XHTML: & Zeichen in der URL olien HTML und CSS 6 22-06-2004 16:49
korrektes format? sauerkraut Flash MX 3 11-04-2004 17:05


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele