首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL,使用libpq插入浮动

PostgreSQL,使用libpq插入浮动
EN

Stack Overflow用户
提问于 2012-03-03 09:21:47
回答 1查看 839关注 0票数 0

我在C中创建了带有混合数据的insert字符串,不能插入行。

正如我所看到的,问题可能出现在浮点数中,在我的语言环境中使用逗号作为小数分隔符。

因此,当插入时,我会得到错误消息:

错误: INSERT比目标列有更多表达式

第1行:...0:11:37.097203 +0100,“关于解决问题的书”,“”,“PCS”,0,000000)

插入代码:

代码语言:javascript
复制
 snprintf(sqlInsert, sizeof(sqlInsert), "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc) VALUES 
 (%d, '%s', '%s', '%s', '%s', '%s', %f)", o, k, dt, es, tagname, meas)), IL.klc);

如何解决这种情况,正确插入双精度数字?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-03 12:52:13

代码语言:javascript
复制
rc = snprintf(sqlInsert, sizeof sqlInsert
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)"
" VALUES               (%d,     '%s', '%s', '%s',  '%s',   '%s', %f);"
                       , o,      k,    dt,   es, tagname, meas, IL.klc);

更新:如果有区域设置问题,setlocale()可能会帮助您在程序中设置本地。LC_ALL=POSIX (或C)应该始终存在。(很可能是{%e %f %g}格式之一对区域设置不敏感)

以下程序演示了setlocale()的使用:

代码语言:javascript
复制
#include <stdio.h>
#include <locale.h>

#pragma DONT define DEFAULT_LOCALE "POSIX"
#define DEFAULT_LOCALE "nl_NL.utf8"
/* LC_NUMERIC LC_ALL */

int main(int argc, char **argv)
{
    double val;
    char *old, *new;

    val = 1024 * 1024;
    val /= 10;

    printf ("Original: Val=%f\n", val);
    new = argv[1] ? argv[1] : DEFAULT_LOCALE ;

    old = setlocale (LC_ALL, new );

    printf("Old=%s, New=%s\n", old, new );
    printf ("After change: Val=%f\n", val);

    new = setlocale (LC_ALL, old );

    printf("Old=%s, New=%s\n", new,  old);
    printf ("After restore: Val=%f\n", val);
return 0;
}

产出:

代码语言:javascript
复制
plasser@pisbak:./a.out
Original: Val=104857.600000
Old=nl_NL.utf8, New=nl_NL.utf8
After change: Val=104857,600000
Old=nl_NL.utf8, New=nl_NL.utf8
After restore: Val=104857,600000
plasser@pisbak:

在阅读了手册之后,我希望setlocale()返回旧的设置,但情况似乎并非如此。也许我无意中改变了一些全球环境:-[

更新:向*printf()函数解释参数总是很好的。

代码语言:javascript
复制
#include <locale.h>
(void) setlocale (LC_NUMERIC, "POSIX" );

rc = snprintf(sqlInsert, sizeof sqlInsert
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)"
" VALUES               (%d,   '%s', '%s', '%s',   '%s',  '%s', %f);"
                  , (int) o,     k,   dt,   es, tagname, meas, (double) IL.klc);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9544928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档