selfhtml.de - Alles für den Webmaster!

 

Anzeige: united-domains - Die ganze Welt der Domains

united domains - jetzt Wunsch-Domain sichern!

Einfache & schnelle Domain-Registrierung zu fairen Preisen ohne Einrichtungsgebühren. Mehr als 250 Domain-Endungen aus einer Hand inklusive E-Mail- & Web-Weiterleitung. Einzigartiges Domain-Portfolio zur bequemen & sicheren Verwaltung Ihrer Domain-Namen.

Jetzt Domain-Check bei united-domains!

Datentyp ändern

Autor: manya
Datum: 27.10.2011 19:02:01

Hallo,

Ich habe in einer Spalte einer SQL-Tabelle Preise eingetragen.
Beim Bestimmen des Durchschnittspreises bringt er mir nun als Ergebnis eine Zahl mit zig Nachkommastellen.
Gewünscht sind aber natürlich nur 2 Dezimalstellen, kaufmännisch gerundet.
Den Datentyp habe ich mit "float" festgelegt, aber irgendwie war das nicht ganz richtig. :-/
Wie kann ich denn jetzt im Nachhinein noch den Datentyp dieser Spalte ändern?

Gruß
manya



Re: Datentyp ändern

Autor: Freddy
Datum: 27.10.2011 22:08:49

Hallo,

> Ich habe in einer Spalte einer SQL-Tabelle Preise
> eingetragen.
> Beim Bestimmen des Durchschnittspreises bringt er
> mir nun als Ergebnis eine Zahl mit zig
> Nachkommastellen.
> Gewünscht sind aber natürlich nur 2
> Dezimalstellen, kaufmännisch gerundet.
> Den Datentyp habe ich mit "float" festgelegt,
> aber irgendwie war das nicht ganz richtig. :-/
> Wie kann ich denn jetzt im Nachhinein noch den
> Datentyp dieser Spalte ändern?

Ich bin alles andere als ein MySQL-Profi, aber kannst Du es nicht bei "float" belassen? Wenn Du mit den Zahlen rechnest, könntest Du doch "round()", "floor()" oder "ceil()" (jenachdem was Du brauchst) benutzen?

Zitat <http://php.net/manual/de/function.round.php>:
<?php echo round(1.95583, 2);  // 1.96 ?>


Gruß + HTH,
Freddy



Re: Datentyp ändern

Autor: manya
Datum: 28.10.2011 10:02:55

> Wenn Du mit den Zahlen rechnest, könntest Du doch
> "round()", "floor()" oder "ceil()" (jenachdem was
> Du brauchst) benutzen?
>
> Zitat
> <http://php.net/manual/de/function.round.php>:
> <?php echo round(1.95583, 2);  //
> 1.96 ?>


Vielen Dank, Freddy :-)
Wenn ich in SQL keine Möglichkeit finde, den Datentyp gleich von Anfang an mit 2 Nachkommastellen festzulegen oder mit ALTER oder MODIFY entsprechend zu ändern, werde ich es so machen müssen, wie Du vorgeschlagen hast.
Interessieren würde es mich aber trotzdem, wie man das in SQL handeln könnte. In PhpMyAdmin habe ich keine Möglichkeit gefunden, die Anzahl der Nachkommastellen anzugeben.

Gruß
manya



Re: Datentyp ändern

Autor: T.Jung
Datum: 29.10.2011 13:48:08

> Interessieren würde es mich aber trotzdem, wie
> man das in SQL handeln könnte. In PhpMyAdmin habe
> ich keine Möglichkeit gefunden, die Anzahl der
> Nachkommastellen anzugeben.

Doch, die hast Du. :-)
Wenn Du das Feld editierst, siehst Du unter dem Select-Menü, in dem »FLOAT« steht, das Eingabefeld »Länge/Set«.
Dort trägst Du sowas wie  »10,2« ein.
Die 10 steht für die Anzahl an Stellen, die die Float insgesamt max. haben darf, die 2 sagt, wieviele davon Nachkommastellen sind. Mit »10,2« wäre also z.B. erlaubt:
12345678.12

Nicht möglich wären hingegen:
123456789.12
oder
12345678.1234


HTH,
Tobias



Re: Datentyp ändern

Autor: manya
Datum: 29.10.2011 14:52:26

Wenn ich alle Beträge selektiere, die kleiner oder größer als eine bestimmte Zahl sind, klappt die Abfrage. Ich kann jedoch nicht auf _Gleichheit_ prüfen.
Als Ergebnis bekomme ich immer die Meldung "0 Zeilen betroffen", obwohl der abgefragte Wert definitiv vorhanden ist.

Mein SQL-Befehl sieht so aus:

UPDATE `verkauf`
SET betrag = 27.00
WHERE betrag = 26.53

http://s1.directupload.net/file/d/2692/6zgpgajb_png.htm

Syntaktisch ist das richtig, aber warum findet er dann das entsprechende Feld nicht?

Außerdem ist mir unverständlich, warum sich der Datentyp "float" anscheinend nicht  ändern läßt. Ursprünglich hatte ich die Spalte "betrag" mit FLOAT(12) festgelegt.
Meine Versuche, das zu ändern, um bei Berechnungen nicht mehr zig Nachkommastellen zu erhalten:

ALTER TABLE 'verkauf'
ALTER COLUMN betrag
SET float(6)

ALTER TABLE 'verkauf'
ALTER COLUMN betrag float(6)

ALTER TABLE 'verkauf'
MODIFY betrag float(6)

Bei allen Versuchen erhielt ich die Fehlermeldung:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax ...

Das sagt mir natürlich gar nichts. :-(
Kann mir da bitte jemand helfen?


Gruß
manya



Re: Datentyp ändern

Autor: manya
Datum: 29.10.2011 15:16:28

> > In PhpMyAdmin habe
> > ich keine Möglichkeit gefunden, die Anzahl
> > der Nachkommastellen anzugeben.
>
> Doch, die hast Du. :-)
> Wenn Du das Feld editierst, siehst Du unter dem
> Select-Menü, in dem »FLOAT« steht, das
> Eingabefeld »Länge/Set«.
> Dort trägst Du sowas wie  »10,2« ein.

Vielen Dank, Tobias, jetzt klappt's!  :-))

Ich hatte mein Tab schon seit Ewigkeiten offen, und gar nicht mitbekommen, daß inzwischen jemand geantwortet hat.

Nach dem Editieren in PhpMyAdmin hat das Feld "betrag" nun FLOAT(5, 2), also 3 Stellen vor, und 2 Stellen hinter dem Komma.

Bei der Abfrage auf Gleichheit

SELECT * FROM `verkauf`
WHERE betrag = 26.53

findet er jetzt auch den richtigen Datensatz. :-)


Trotzdem würde es mich interessieren, warum das vorher nicht geklappt hat, als das Feld nur mit FLOAT festgelegt war, siehe mein Posting von 07:52.
(Mit der Uhrzeit stimmt etwas nicht !?!)  

Interessehalber wüßte ich auch gerne, wie man solche Datentypänderungen im Query vornimmt.
Ich hatte in zahlreichen Postings unt Tuts gegoogelt, und die dort gegebenen Tipps übernommen, aber bei mir hat es nie geklappt, siehe mein Vorposting.

Gruß
manya



Re: Datentyp ändern

Autor: T.Jung
Datum: 29.10.2011 16:00:55

> Bei der Abfrage auf Gleichheit
>
> SELECT * FROM `verkauf`
> WHERE betrag = 26.53
>
> findet er jetzt auch den richtigen Datensatz.
> :-)
>
>
> Trotzdem würde es mich interessieren, warum das
> vorher nicht geklappt hat, als das Feld nur mit
> FLOAT festgelegt war

Hmm, das kann ich mir eigentlich nur so erklären:
Der Wert war eben nicht 26.53, sondern (vielleicht bedingt durch eine Berechnung, die mit dem Feld durchgeführt wurde) z.B. sowas wie 26.5299999.
Wobei ich eigentlich glaube, dass FLOAT() ohne weitere Angaben zu zwei Nachkommastellen führt... somit würde meine Vermutung nicht passen. :-/

> Interessehalber wüßte ich auch gerne, wie man
> solche Datentypänderungen im Query vornimmt.

Ääähmm, *hüstel*... da hättest Du besser aufpassen sollen... ;-)
Nachdem Du die Änderung am Feld vorgenommen hast, zeigt phpMyAdmin nämlich nochmal den Query an, den es abgesetzt hat. In diesem Fall hat er etwa so gelautet:
ALTER TABLE `tabelle` CHANGE `feld` `feld` FLOAT( 5, 2 )

Gruß,
Tobias



Re: Datentyp ändern

Autor: Netinja
Datum: 29.10.2011 17:18:51

> Wenn ich alle Beträge selektiere, die kleiner
> oder größer als eine bestimmte Zahl sind, klappt
> die Abfrage. Ich kann jedoch nicht auf
> _Gleichheit_ prüfen.
> Als Ergebnis bekomme ich immer die Meldung "0
> Zeilen betroffen", obwohl der abgefragte Wert
> definitiv vorhanden ist.
>
> Mein SQL-Befehl sieht so aus:
>
> UPDATE `verkauf`
> SET betrag = 27.00
> WHERE betrag = 26.53
>
>
> http://s1.directupload.net/file/d/2692/6zgpgajb_png.htm
>
> Syntaktisch ist das richtig, aber warum findet er
> dann das entsprechende Feld nicht?

Hi,
Auf Wikipedia habe ich etwas dazu gefunden.

"float und double
    sind für technisch-wissenschaftliche Werte geeignet und umfassen auch die Exponentialdarstellung. Wegen der Speicherung im Binärformat sind sie aber für Geldbeträge nicht geeignet, weil sich beispielsweise der Wert 0,10 € (entspricht 10 Cent) nicht exakt abbilden lässt."

http://de.wikipedia.org/wiki/SQL

Vielleicht hängt es damit zusammen.

LG
Netinja



Re: Datentyp ändern

Autor: manya
Datum: 29.10.2011 20:00:35

Wikipedia:
http://de.wikipedia.org/wiki/SQL
> "float und double
>     sind für
> technisch-wissenschaftliche Werte geeignet und
> umfassen auch die Exponentialdarstellung. Wegen
> der Speicherung im Binärformat sind sie aber für
> Geldbeträge nicht geeignet, weil sich
> beispielsweise der Wert 0,10 € (entspricht 10
> Cent) nicht exakt abbilden lässt."

Das verstehe ich jetzt aber nicht.
Weiter oben steht:
"float (m)
    Gleitkommazahl (positiv oder negativ) mit maximal m Nachkommastellen."

Warum soll sich dann ausgerechnet ein Geldbetrag, also eine Zahl mit 2 Nachkommastellen _nicht_ abbilden lassen?
Bei der testweisen Eingabe von einem 10-Cent-Betrag gab es kein Problem.
Beim Rechnen stelle ich jedoch fest, daß bei FLOAT(5,2) nicht kaufmännisch gerundet, sondern bei Bedarf abgeschnitten wird:

UPDATE `verkauf`
SET betrag = betrag / 3
WHERE betrag = 0.10

Ergebnis: 0.03

UPDATE `verkauf`
SET betrag = betrag * 3
WHERE betrag = 0.03

Ergebnis: 0.09




> > Bei der Abfrage auf Gleichheit
> >
> > SELECT * FROM `verkauf`
> > WHERE betrag = 26.53
> >
> > findet er jetzt auch den richtigen
> Datensatz.
> > :-)
> >
> >
> > Trotzdem würde es mich interessieren, warum
> > das vorher nicht geklappt hat, als das Feld
> > nur mit FLOAT festgelegt war
>
> Hmm, das kann ich mir eigentlich nur so
> erklären:
> Der Wert war eben nicht 26.53, sondern
> (vielleicht bedingt durch eine Berechnung, die
> mit dem Feld durchgeführt wurde) z.B. sowas wie
> 26.5299999.

Der Wert 26.53 war original genauso eingegeben worden, deshalb hat es mich ja auch gewundert, warum er nicht gefunden wurde. Aber jetzt, wo ich die 2 Nachkommastellen explizit im Datentyp angegeben habe, funktioniert es.


> > Interessehalber wüßte ich auch gerne, wie
> > man solche Datentypänderungen im Query
> > vornimmt.
>
> Ääähmm, *hüstel*... da hättest Du besser
> aufpassen sollen... ;-)
> Nachdem Du die Änderung am Feld vorgenommen hast,
> zeigt phpMyAdmin nämlich nochmal den Query an,
> den es abgesetzt hat.

Wie peinlich!
Ja, Du hast recht.

Vielen Dank für Eure Antwort, Netinja und Tobias :-)

Gruß
manya



Re: Datentyp ändern

Autor: T.Jung
Datum: 30.10.2011 11:21:25

Nur ganz kurz, habe gerade nicht viel Zeit...

> > "float und double sind für
> > technisch-wissenschaftliche Werte geeignet und
> > umfassen auch die Exponentialdarstellung. (...)
>
> Das verstehe ich jetzt aber nicht.
> Weiter oben steht:
> "float (m)
>     Gleitkommazahl (positiv
> oder negativ) mit maximal m Nachkommastellen."
>
> Warum soll sich dann ausgerechnet ein Geldbetrag,
> also eine Zahl mit 2 Nachkommastellen _nicht_
> abbilden lassen?

Herrje, stimmt... das wusste ich auch mal, hatte es aber völlig vergessen. :-(
Gut, dass mir das durch diesen Thread wieder in Erinnerung gerufen wurde!

Also, für Geldbeträge sollte man in MySQL tatsächlich nicht den Datentyp FLOAT nehmen, sondern DECIMAL.
Hier ein etwas älterer Thread auf selfhtml.org zu diesem Thema:
http://forum.de.selfhtml.org/archiv/2009/4/t185883/

In diesem Thread wird ein Kapitel der englischen MySQL-Doku verlinkt, die entsprechende deutsche Version ist:
http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html

Gruß,
Tobias