SQL MySQL-DB float in decimal konvertieren

mischaef

Kassettenkind
Teammitglied
Registriert
Aug. 2012
Beiträge
6.147
Mahlzeit zusammen,

ich habe den großen Fehler gemacht (ja ich weiß), für Beträge in meiner MySQL-Datenbank float zu wählen. Jetzt würde ich die Spalte gerne in Decimal konvertieren. Am einfachsten wäre es natürlich per phpMyAdmin, aber da finde ich nichts, wo ich die Nachkommastellen einstellen könnte.

Hätte jemand evt. einen Tipp, wie ich das per SQL-Anweidung machen könnte?

Besten dank schon mal!

Michael
 
Zuerst Backup machen.
Dann sagt mir ChatGPT das:

ALTER TABLE deine_tabelle MODIFY deine_spalte DECIMAL(10,2);

Sind 10 Ziffern, davon 2 Nachkommastellen.
 
  • Gefällt mir
Reaktionen: mischaef und nutrix
Vorher komplettes Backup der Tabelle exportieren.
Dann neue Spalte hinzufügen:
SQL:
ALTER TABLE `the_table` ADD COLUMN `new_value` BIGINT(20) NOT NULL;
Den Wert für jede Zeile aus der alten Spalte berechnen (für xx,yy € -> xxyy Cents):
SQL:
UPDATE `the_table` SET `new_value` = ROUND(`value`, 2) * 100;
Überprüfen ob die Werte richtig konvertiert/gerundet wurden. Dann alte Spalte löschen:
SQL:
ALTER TABLE `the_table` DROP COLUMN `value`;
Falls gewünscht die neue Spalte umbenennen in die alte:
SQL:
ALTER TABLE `the_table` RENAME COLUMN `new_value` `value`;
 
  • Gefällt mir
Reaktionen: icked, mischaef und nutrix
Wobei die Konvertierung der Daten eigentlich automatisch erfolgen sollte bei einem ALTER MODIFY.

Und warum BIGINT?
Für Währungsbeträge ist der Typ DECIMAL ja wie geschaffen...
 
Ich speichere für Beträge immer Cents als einfachen Integer, damit ist am leichtesten zu arbeiten über verschiedene Programmiersprachen/Dateiformate hinweg. DECIMAL in MySQL ist zwar völlig korrekt aber wenn du bei der Abfrage der Daten in deinem Code dann mit floats arbeitest läufst du wieder Gefahr ungenaue Ergebnisse zu bekommen wegen IEE754-Rundung auf Binärwerte.
 
Also du hast eine Lösung, aber sie passt nicht zum Problem?

Und die Datenbank selbst ist auch mit Decimal genau. Um Rundungsfehler zu vermeiden muss der Code halt richtig sein. Den kann man auch falsch machen, wenn man BIGINT in der DB verwendet.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: BeBur
Was willst du jetzt? OP will Beträge korrekt speichern und so werden sie korrekt gespeichert. Wenn er DECIMAL vorzieht kann er das auch machen.
 
Was ich halt nicht verstehe: Warum erklärst du das nicht explizit dort, wo du auch die Anweisungen postest?
 
Ganz schön viel Kritik für jemanden der seine Antworten aus ChatGPT copy-pasted.
 
Das hat bis hier hin schon mal wunderbar geklappt...daraus resultiert jetzt, wie so oft, aber ein anderes Problem: Mir werden die Beträge jetzt natürlich mit einem "." als Trenner für die Nachkommastellen angezeigt. Bei PHP würde ich da normalerweise mit number_format() rangehen, aber das scheint seine Tücken bei Eingabefelder zu haben (z.B. wenn ein Betrag geändert werden soll)...bei mir werden dann in dem Eingabefeld (type='number'), warum auch immer, keine Beträge ab vier Stellen vor dem Komma angezeigt. Alles darunter ohne Probleme.

Warum ich type='number' nutze? Weil mein JS-Script ansonsten bei der Zusammenrechnung von nachkommestrellen bei der Eingabe Probleme bekommt.

Kennt jemand das Problem? Will deswegen jetzt nicht extra einen neuen Thread eröffnen.
 
Zuletzt bearbeitet:
mischaef schrieb:
Mir werden die Beträge jetzt natürlich mit einem "." als Trenner für die Nachkommastellen angezeigt.
Interne Speicherung und Darstellung sind voneinander zu trennen. Lass das Trennzeichen so, wie es ist. Ansonsten kannst du das Format einfach einstellen -> Google.
 
@BeBur
Das ist mir klar, das ist auch nicht mein Problem. Mein Problem liegt in der unterschiedlichen Handhabung der Zahlen bei normalen Input-Feldern und denen speziell für Zahlen. Ich hab das Javascript mittlerweile aber - hoffentlich - angepasst bekommen. Mal schauen, ob nicht irgendwo doch Probleme auftauchen...
 
Der Wert von input-Feldern ist immer ein String, egal ob type "text" oder "number". Bei "number" steht zusätzlich noch das Attribut valueAsNumber zur Verfügung.
 
Zuletzt bearbeitet:
Marco01_809 schrieb:
Ganz schön viel Kritik für jemanden der seine Antworten aus ChatGPT copy-pasted.
Ich verstehe, dass die Erkenntnis, dass eine KI die Frage besser beantwortet schlimm sein muss.
Ich habe übrigens exakt den Wortlaut des Eröffnungsposts verwendet.

1714910274790.png


Aber ist seit Jahren ja normal, dass man sich Kritik nicht auf Sachebene, sondern mit Ad-hominem stellt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: mischaef
Beim Surfen auf YouTube bin ich über dieses aktuelle Video zum Thema gestoßen. Spoiler: der Autor empfiehlt DECIMAL. Weil ich diesen Thread mitgelesen habe, aber vor allem aus eigener Neugier habe ich dann spontan mal grob recherchiert, was eigentlich diverse, mir nicht geläufige Programmiersprachen an Typen bzw. Libraries für Decimals bieten, denn offensichtlich bringt es nichts, Decimals in der Datenbank zu haben, wenn man sie effektiv als Float bzw. Double lädt und dann damit rechnet.

Dabei habe ich mich irgendwann gefragt, ob PHP eigentlich Operator Overloading unterstützt.
tollertyp schrieb:
Ich verstehe, dass die Erkenntnis, dass eine KI die Frage besser beantwortet schlimm sein muss.
Die AI von Brave Search so:
1714964817434.png


Das ist etwas widersprüchlich und ich konnte sonst nichts zu den genannten Methoden finden. Sie gehören nicht zu den Magic Methods.

Andere Assistenten sind, soweit ich das beurteilen kann, besser:

PHP does not support operator overloading in the traditional sense. Operator overloading, which allows you to define custom behaviors for operators, is a feature offered by some other programming languages but not in PHP.
However, PHP does provide a form of overloading through magic methods. These methods allow you to create properties and methods dynamically. They are invoked when interacting with properties or methods that have not been declared or are not visible in the current scope. For example, the __get(), __set(), __isset(), and __unset() magic methods can be used to overload properties.
It's also worth noting that PHP supports overloading of some operators, like [], -> and (string), and also allows overloading some language constructs like foreach.
For array-like behavior, you can implement the ArrayAccess interface. This interface allows objects to interact like arrays. If you would also like to use your object in the context of 'foreach', you'd have to implement the 'Iterator' interface.
So, while PHP does not support full operator overloading, it does offer some flexibility through its magic methods and interfaces. Please note that this is different from the operator overloading found in languages like C++ or Python.

1714965656927.png

Meine Erkenntnis ist, dass AI mit Vorsicht zu genießen ist - insbesondere dann, wenn man keine Ahnung von dem Thema hat, zu dem man sie befragt. 🤪
 
Zurück
Oben