Detaillierte Erläuterung möglicher Probleme bei der Konvertierung von Gleitkommadaten in Zeichendaten in MySQL

Detaillierte Erläuterung möglicher Probleme bei der Konvertierung von Gleitkommadaten in Zeichendaten in MySQL

Vorwort

In diesem Artikel wird hauptsächlich ein Problem beschrieben, das bei der Konvertierung von Gleitkommatypen in Zeichentypen in MySQL auftritt. Er wird zu Ihrer Information und zum Lernen weitergegeben. Schauen wir uns ohne weiteres die ausführliche Einführung an.

1. Problembeschreibung

Heute bin ich auf eine Datenaktualisierungsanforderung gestoßen, nämlich das Gewicht des Produkts zu ändern (der Feldtyp ist Float). Nachdem das Gewicht des Produkts geändert wurde, muss es in der Protokolltabelle aufgezeichnet werden (der Feldtyp ist varchar). Die Tabellenstruktur ist wie folgt:

Datentabelle vorübergehend aktualisieren:

CREATE TABLE `temp_170830` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel-ID',
 `goods_sn` varchar(255) NOT NULL DEFAULT '' KOMMENTAR 'Produktcode',
 `goods_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT 'Produktgewicht',
 `actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT 'Tatsächliches Gewicht',
 `new_actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT 'Neues tatsächliches Gewicht',
 `create_user` varchar(30) NOT NULL DEFAULT '' COMMENT 'Erstellt von',
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_goods_sn` (`goods_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=8192 DEFAULT CHARSET=utf8 COMMENT='Temporäre Aktualisierungsgewichtstabelle';

Protokolltabelle:

Tabelle „log_weight“ erstellen (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel-ID',
 `goods_sn` varchar(50) NOT NULL DEFAULT '' KOMMENTAR 'Produktcode',
 `which_col` varchar(100) NOT NULL DEFAULT '' COMMENT 'Feld ändern',
 `old_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT 'Wert vor Update',
 `new_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT 'Aktualisierter Wert',
 `update_user` varchar(100) NICHT NULL STANDARD '' KOMMENTAR 'Ersteller',
 `update_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP,
 `wh_update_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Änderungszeit des Datensatzes',
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_goods_sn` (`goods_sn`),
 SCHLÜSSEL `idx_update_user` (`update_user`),
 SCHLÜSSEL `wh_update_time` (`wh_update_time`)
) ENGINE=InnoDB AUTO_INCREMENT=14601620 DEFAULT CHARSET=utf8 COMMENT='Protokoll der Gewichtsänderung';

Wie in der oben erstellten Tabelle gezeigt, muss ich die Felder „actual_weight“ und „new_actual_weight“ der Tabelle „temp_170830“ in die Felder „old_value“ und „new_value“ der Tabelle „log_weight“ übertragen. Die SQL-Anweisungen lauten wie folgt:

INSERT INTO log_weight(Warennummer, welche_Spalte, alter_Wert, neuer_Wert, Benutzer aktualisieren)
SELECT Warennummer, „tatsächliches Gewicht“, „tatsächliches Gewicht“, „neues tatsächliches Gewicht“, „Benutzer erstellen“ FROM temp_170830;

Ich dachte, ich wäre hier fertig, schließlich habe ich nur einige Protokolldatensätze eingefügt. Später stellte ich bei einer einfachen Überprüfung fest, dass die Daten ein wenig falsch waren, wie in der folgenden Abbildung dargestellt:

Screenshot der temporären Tabellendaten:

Screenshot der Protokolltabellendaten:

Im Vergleich dazu können wir feststellen, dass die eingefügten Protokolldatensätze ohne Grund viel mehr Dezimalstellen am Ende haben. Ich weiß nicht, woher sie kommen. Später dachte ich, dass es daran liegen könnte, dass die Gleitkommadaten nicht teilbar sind. Bei der Konvertierung in varchar werden auch die Dezimalstellen am Ende herausgenommen. Ich bin mir im Moment nicht sicher. Ich werde mehr hinzufügen, nachdem ich es bestätigt habe. Dann fand ich eine Methode zur Konvertierung in varchar, concat, und passte sie wie folgt an:

INSERT INTO log_weight(Warennummer, welche_Spalte, alter_Wert, neuer_Wert, Benutzer aktualisieren)
SELECT Warennummer, „tatsächliches Gewicht“, concat(tatsächliches Gewicht, „), concat(neues tatsächliches Gewicht, „), Benutzer erstellen FROM temp_170830;

Das Protokollierungsproblem wurde erfolgreich gelöst.

Um es zusammenzufassen:

1 Versuchen Sie beim Aufzeichnen numerischer Felder für Preise und Gewichte, keine Gleitkommatypen zu verwenden! ! ! , Gleitkommazahlen haben viele Fallstricke (zum Beispiel können Gleitkommatypen nicht als gleich beurteilt werden!!!), daher ist es am besten, den Integer-Typ int zu verwenden. Wenn im Geschäftsleben Dezimalzahlen angezeigt werden müssen, lesen Sie sie aus und dividieren Sie sie durch die entsprechende Anzahl von Ziffern. Beispielsweise sollten 99,98 Yuan als 9998 gespeichert werden, und beim Auslesen verwenden Sie 9998/100, um sie anzuzeigen.

2 Wenn Sie Float in Varchar konvertieren, sollten Sie zuerst Float mit der Funktion concat in Varchar konvertieren und es dann im Varchar-Feld speichern.

Nun, das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

<<:  Detaillierte Erklärung des Sandbox-Mechanismus von Vue3

>>:  Linux verwendet join -a1, um zwei Dateien zusammenzuführen

Artikel empfehlen

Die Verwendung und der Unterschied zwischen JavaScript-Pseudo-Array und Array

Pseudo-Arrays und Arrays In JavaScript sind mit A...

Eine einfache Methode zum Zusammenführen und Entfernen doppelter MySQL-Tabellen

Szenario: Die gecrawlten Daten erzeugen eine Date...

So verwenden Sie Makros in JavaScript

In Sprachen werden häufig Makros zur Implementier...

Dynamischer Sternenhimmel Hintergrund umgesetzt mit CSS3

Ergebnis:Implementierungscode html <link href=...

Tutorial zur Installation und Verwendung von Docker MQTT

Einführung in MQTT MQTT (Message Queuing Telemetr...

Mit CSS3 implementierter Gradienten-Folieneffekt

Ergebnisse erzielen Code html <div Klasse=&quo...

Analyse des Problems der Hyper-V-Installation unter CentOS 8

CentOS 8 ist schon seit längerem auf dem Markt. A...

Eine kurze Diskussion zum Implementierungsprinzip des Vue-Slots

Inhaltsverzeichnis 1. Beispielcode 2. Sehen Sie d...

CSS-Implementierungscode für mehrstufige Menüs

Dies ist eine ziemlich coole Funktion, die Websei...

Erläuterung des TypeScript-Namespace

Inhaltsverzeichnis 1. Definition und Verwendung 1...

Detaillierter Installationsprozess von mysql5.7.21 unter Win10

In diesem Artikel erfahren Sie mehr über die Inst...