Драйвер PSQL ODBC преобразует значения с фиксированной запятой в значения с плавающей запятой на компьютерах под управлением Windows 7 Enterprise
Фон
У нас есть устаревшее приложение для Windows (разработанное в Clarion), которое использует PostgreSQL 9.3 в качестве внутренней базы данных. Приложение использует PostgreSQL ODBC 32-bit Driver (Unicode) 9.03.04 для взаимодействия с базой данных.
До сих пор все пользователи приложения использовали 64-разрядные машины Windows 7 Professional и на них была установлена одинаковая версия 32-разрядного драйвера PostgreSQL ODBC. До этого все работало хорошо. С прошлого месяца мы начали предоставлять новым пользователям Windows 7 Enterprise 64-битные машины. Когда мы установили на эти новые машины одну и ту же 32-битную версию драйвера psql-odbc, по умолчанию была установлена 64-битная версия драйвера. Затем мы вручную установили драйвер psql odbc 9.05.01, который имел 32-разрядный специальный установщик (после удаления драйвера x64) на всех этих машинах, чтобы гарантировать, что все машины используют 32-разрядный драйвер.
проблема
На всех более новых компьютерах под управлением Windows 7 Enterprise, когда поле базы данных с фиксированным десятичным значением вставляется или обновляется, оно преобразуется в более длинную точность с плавающей запятой.
Ниже приведен запрос, который регистрируется на сервере при обновлении с этих более новых компьютеров.
UPDATE schema.table SET VALUE = $1 WHERE ID = $2
parameters: $1 = '-57.192999999999998', $2 = '672718'
Data Types are VALUE:numeric and ID:integer
Проблема в том, что приложение на самом деле передает значение как -57.193 и проходит через базу данных точно как -57.193 со всех машин "Win7 Pro", но Win7 Enterprise отправляет данные в postgres с 15 десятичными числами. мест.
Я отладил приложение, чтобы убедиться, что значения передаются в odbc с 3 десятичными знаками во всех случаях. Я могу подтвердить, что на стороне приложения нет проблем. Но odbc фактически конвертирует все запросы с десятичными знаками с фиксированной запятой в 15 десятичных разрядов. Это происходит для всех запросов, в которые вставляются или обновляются десятичные поля с фиксированной запятой. Во всех случаях десятичное значение 3 или 4 преобразуется в десятичное значение после периода.
Что отличается на этих компьютерах с Windows 7 Enterprise, которые могут вызвать эту проблему? Я убедился, что все машины используют 32-битные драйверы PSQL ODBC (хотя это разные версии). Та же проблема возникала, даже когда на компьютерах Enterprise была установлена одинаковая версия (9.03.04) 64-разрядного драйвера. Я смотрю на это неправильно? Может быть, проблема где-то за пределами версии ОС и ODBC, любые предложения приветствуются.
Я попытался прочитать журнал трассировки ODBC, чтобы увидеть точные значения входных и выходных параметров SQL, но они не отображаются в виде обычного текста. Они в следующем формате.
HSTMT 0x0305F650
UWORD 1
SWORD 1 <SQL_PARAM_INPUT>
SWORD 8 <SQL_C_DOUBLE>
SWORD 2 <SQL_NUMERIC>
SQLULEN 28
SWORD 6
PTR 0x0445F02E
SQLLEN 8
SQLLEN * 0x04818D08
Любая помощь даже для чтения значений параметров из журнала трассировки ODBC высоко ценится.