Написання 0.001
до Postgres (9.1 - 9.3) через адаптер даних .net - це дивно 0.00
значення (у pgAdmin), яке відображається як нуль, але ні.
Насправді, прості запити люблять SELECT 1/(SELECT "weird_field" ...) FROM ...
коректно дає 1000
.
Більш складні запити (з поділом) напрочуд призводять до division by zero
помилка
Крім того, замовлення в Navicat правильно показує ці значення між 0,0011 і 0,0009
Ми використовуємо бібліотеки Devart для підключення до бази даних, але винуватцем видається адаптер даних (або, принаймні, комбінація цих двох), оскільки простий прямий запит, все ще за допомогою драйверів Devart, не дає однакових результатів.
Будь-яка ідея про те, що відбувається?
--
EDIT:
Тип на БД - numeric
, в програмі представлений як double
decimal
.
pSQL друкує це:
--
0.00
(1 ряд)
--
EDIT 2:
log_statement = "all"
дає дивніший результат:
UPDATE "TABLE" SET ... "WEIRD_FIELD"=$8 ... WHERE ...
DETAIL: parameters: $1 = "7", $2 = "7", $3 = "18", $4 = "18", $5 = "V03", $6 = "Hz",
$7 = "Hz", $8 = "0.00", $9 = "0", $10 = "2", $11 = "0"
Параметр для дивного поля друкується як нуль (0,00), але очевидно, що це не так ...
Зверніть увагу, що значення в DataGridView заповнюється DataAdapter показує правильний 0.001
.
--
EDIT 3 (Моріс):
Здається, проблема з адаптером Devartвиправлений. Використовуючи останню версію, я більше не бачу проблеми. Я думаю, це пов'язано з цим конкретним виправленням: 7.3.293 20 листопада 14: Виправлена помилка з втратою точності при роботі з PgSqlType.Numeric через протокол 3 Я модернізував своє програмне забезпечення, використовуючи останні збірки Devart, і тепер все працює, як очікувалося.
Відповіді:
2 для відповіді № 1Ми виявили, що проблема полягає в тому, як представляє PgSql numeric
s (десятковий) з невизначеною точністю та масштабом.
Значення в БД здається правильним (0.001
), але в деяких операціях він усічений:
"weird_field" + 0.001
---------------------
0.002
але
"weird_field" * 2
--------------------
0.00
і
"weird_field" * 5
--------------------
0.01
Це також пояснює, чому деякі запити дають division by zero
помилка
Рішення полягає у визначенні точності та масштабу, наприклад, ми вибрали numeric(38,28)
(що ми також використовуємо для десяткової в Oracle) і все працює нормально.
--
Переглядаючи документацію PgSql, ми не знайшли нічого про цю поведінку, тому вважаємо, що це помилка:
Вказуючи:
NUMERIC
без будь-якої точності або масштабу створює стовпецьв якому можуть зберігатися числові значення будь-якої точності та масштабу, аж до обмеження точності. Стовпець такого типу не буде примушувати введені значення до будь-якого конкретного масштабу, тоді як числові стовпці з оголошеним масштабом примушуватимуть введені значення до цього масштабу.
Дивна річ і в тому 0.000001
(et similia) не скорочується, поки 0.001
робить