Ich frage, weil Mein Client verwendet JDBC und wir haben festgestellt, dass sich die Ausgabewerte zwischen Windows- und Linux-Umgebungen unterscheiden. Nach dem Speichern von 123456.6543214586532653516 in der Datenbank und dem Drucken auf der Konsole von Linux- und Windows-Systemen sind die Ergebnisse beispielsweise unterschiedlich:
Code: Select all
Linux: 123456.65432145866000000000
Windows: 123456.65432145864000000000
Zur weiteren Untersuchung habe ich den gleichen Wert sowohl in Python als auch in Java in meinen x86-Windows- und x86-Linux-Umgebungen getestet. Konkret habe ich einer Variablen den Wert 123456.6543214586532653516 zugewiesen und ihn direkt auf der Konsole ausgegeben. In beiden Umgebungen war die Ausgabe konsistent 123456.65432145866, unabhängig vom Betriebssystem oder der virtuellen Maschine.
Kann jemand erklären, was diese Inkonsistenz verursachen könnte?
=========================================== ======
Erste Bearbeitung
Genauer gesagt geht dieses Problem auf eine Frage zurück, die mein Kollege von einem Kunden erhalten hat. Da es sich hierbei nicht um eine Frage handelt, die ich direkt erhalten habe, und da mein Kollege und ich unterschiedliche Aufgaben bearbeiten, beschränken sich die mir zur Verfügung stehenden Informationen leider auf das, was ich hier mitteile. Sowohl mein Kollege als auch ich arbeiten für ein Datenbankunternehmen namens Tibero, das Abfragen unterstützt, die denen in Oracle ähneln. Der Kunde berichtete, dass er unter Windows und Linux unterschiedliche Ergebnisse erhält, wenn er denselben Java-Code ausführt. Leider gehört der Java-Code dem Kunden und wir können ihn daher nicht weitergeben. Der Kunde erwähnte jedoch, dass die folgende SQL-Abfrage, ausgeführt in tbsql – dem CLI-Tool unseres Unternehmens, das sqlplus ähnelt – ebenfalls die gleiche Diskrepanz erzeugt:
Code: Select all
CREATE TABLE convert_test(c1 BINARY_DOUBLE);
INSERT INTO convert_test VALUES(123456.6543214586532653516);
SELECT TO_CHAR(c1, '999999999999999D9999999999999999999', 'NLS_NUMERIC_CHARACTERS = ''.'''') AS formatted_value
FROM convert_test;
Nur zur Kontrolle habe ich auch PostgreSQL installiert sowohl Windows als auch Linux und führte die folgende Abfrage aus. Die Ergebnisse waren auf allen Plattformen konsistent und zeigten keine Unterschiede:
Code: Select all
CREATE TABLE convert_test (
c1 DOUBLE PRECISION
);
INSERT INTO convert_test VALUES (123456.6543214586532653516);
SELECT C1 FROM CONVERT_TEST;
c1
--------------------
123456.65432145866