LINUX.ORG.RU

unixODBC, SQLBindParameter с типом double не работает в локалях, отличных от «C»


0

0

Баг или фича, или я что-то не понимаю?

double d = 0.1; SQLRETURN r = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &d, 0, NULL);

в русской (ru_RU.UTF8) локали проходит нормально, но при последующем SQLExecute происходит ошибка, SQLGetDiagRec возвращает "[22P02]Error while executing the query; ERROR: неверный входной синтаксис для типа double, точность: "0,2""

если сделать LANG=С;export LANG и прогнать тот-же код, то все проходит хорошо.

если биндить параметр как строку:

string s = "0.1"; SQLRETURN r = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, s.length(), 0, (SQLCHAR*)s.c_str(), 0, NULL);

то вне зависимости от текущей локали - всё хорошо. В чём-же дело? Похоже на ошибку в ODBC подсистеме. Может стоит всегда биндить параметры как строки, если они внутри подсистемы ODBC, по-видимому, всё равно в строки превращаются?

anonymous

извиняюсь, сообщение об ошибке в первом случае выдает правильное число, я опечатался, т.е. его следует читать так: "[22P02]Error while executing the query; ERROR: неверный входной синтаксис для типа double, точность: "0,1""

anonymous
()
Ответ на: комментарий от anonymous

сложный вопрос на самом деле :)

в русском языке разделитель десятичной дроби - запятая, а не точка. имхо то что ODBC ведёт себя в соответствии с локалью - это на 60% Ваша проблема, а не ODBC :)

сделайте у себя в программе: setlocale(LC_NUMERIC, "C");

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

Как я понимаю, локаль в этом случае будет влиять на преобразование строкового представления числа. Я назначаю параметру запроса тип double, а не строку. Машинное представление типа double не зависит от локали, так ведь? Так почему-же SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, d, 0, NULL) так себя ведет, ведь я не передаю никаких строковых представлений чисел? В документации на ODBC API не сказано, что при связывание параметров с переменными происходят какие-либо преобразования типов и о том, что я должен делать setlocale. ИМХО - баг или особенности реализации ODBC драйвера (у меня PostgreSQL), именно это я и пытаюсь выяснить :) Почему это моя проблема, почему именно на 60%?

anonymous
()
Ответ на: комментарий от anonymous

ну потому что на 40% имхо Вы правы - это баг и оно должно работать независимо от локали :)

машинное представление может и не зависит, но SQL запрос - это текст, а не бинарное машинное представление, поэтому понятно откуда бага выросла... имхо

Eshkin_kot ★★
()

Баг скорее всего в драйвере ODBC, unixODBC не переводит входные параметры в строки.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.