【问题标题】:libpq only inserts first character in string columnlibpq 只在字符串列中插入第一个字符
【发布时间】:2017-03-06 15:19:47
【问题描述】:

所以我的 psql 表中有这个结构,叫做rooms

                                         Table "public.rooms"
         Column          |          Type          |                     Modifiers
-------------------------+------------------------+----------------------------------------------------
 id                      | integer                | not null default nextval('rooms_id_seq'::regclass)
 room_id                 | integer                |
 room_name               | character varying(100) |
 room_secret             | character varying(255) |
 room_pin                | character varying(100) |
 room_communication_type | character varying(30)  |
Indexes:
    "rooms_pkey" PRIMARY KEY, btree (id)
    "index_rooms_on_room_id" UNIQUE, btree (room_id)
    "index_rooms_on_room_name" btree (room_name)
    "index_rooms_on_room_secret" btree (room_secret)

当我尝试从我的 C 程序中执行和插入语句时,我得到了以下结果:

janus_audiobridge=# SELECT * FROM rooms;
 id | room_id | room_name | room_secret | room_pin | room_communication_type
----+---------+-----------+-------------+----------+-------------------------
  1 |  111128 | I         | L           |          | r
  3 |  111129 | C         | c           |          | r
  4 |  111130 | 4         | b           |          | r
  6 |  111131 | 5         | b           |          | r
(4 rows)

请注意room_nameroom_secretroom_communication_type 仅包含 1 个字符,我要插入的原始数据是完整的文本句子。

这是我的 C 代码:

  const char *paramValues[5];
  paramValues[0] = "111131";
  paramValues[1] = room->room_name;
  paramValues[2] = room->room_secret;
  paramValues[3] = room->room_pin;
  paramValues[4] = room->room_communication_type;


  JANUS_LOG(LOG_WARN, "name: %s", paramValues[1]);

  JANUS_LOG(LOG_ERR, "44444\n\n\n");
  PGresult *res = PQexecParams(conn, query,
    5,       /* one param */
    NULL,    /* let the backend deduce param type */
    paramValues,
    NULL,    /* don't need param lengths since text */
    NULL,    /* default to all text params */
    0);      /* ask for text results */

当我运行INSERT 时,JANUS_LOG 行返回正确的名称,但只插入第一个字符。

如何使用 libpq 将全文插入 postgres 数据库?

谢谢!

编辑:我的query 字符串:

gchar *query = "INSERT INTO rooms(room_id, room_name, room_secret, room_pin, room_communication_type) " 
"VALUES($1::int, $2::char, $3::char, $4::char, $5::char);";

【问题讨论】:

  • 您的PQprepare () 电话在哪里? struct room 的定义是什么?
  • 我不使用那个。这能解决我的问题吗?
  • query 字符串长什么样子?
  • 更新了问题。

标签: c postgresql libpq


【解决方案1】:

INSERT 语句中删除对char 的强制转换(与character(1) 相同)。然后一切都应该正常工作。 int 的强制转换也是不必要的。

您可以在psql 中看到这个简单的实验会发生什么:

SELECT 'hello'::char;
 bpchar
--------
 h
(1 row)

转换为character varying 会起作用,但没有必要显式转换,因为在INSERT 期间无论如何都会执行赋值转换

正如the documentation 所说:

应用于未修饰的字符串文字的强制转换表示初始 将类型分配给文字常量值,因此它将成功 对于任何类型(如果字符串文字的内容是可接受的输入 数据类型的语法)。

【讨论】:

  • 成功了。凭什么?!我遵循了指导方针。几个问题:我的代码现在安全吗(当我移除演员表时)?
  • 哪些指南?
  • PQexecParams的例子中:/
  • @IvRRimUm 我扩展了答案以涵盖“为什么”。通过该修改,您的代码看起来没问题(并且不受 SQL 注入的影响)。
  • 我猜你的意思是this 示例程序。在该示例中,使用了二进制参数,并且注释说:这是发送二进制参数时的良好安全措施。
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2011-05-09
  • 2022-01-08
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多