繁体   English   中英

PostgreSQL,使用libpq插入浮点数

[英]PostgreSQL, Inserting floats with libpq

我在C中使用混合数据创建了插入字符串,并且无法插入行。
如我所见,问题可能出在浮点数中,该浮点数在我的语言环境中使用逗号作为小数点分隔符。

因此,插入时出现错误消息:

错误:INSERT的表达式多于目标列
第1行:... 0:11:37.097203 +0100','关于解决问题的书','','PCS',0,000000)

插入代码:

 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);

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

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()的用法:

#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;
}

输出:

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()函数总是好的。

#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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM