所以我的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_name
,room_secret
和room_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);";
答案 0 :(得分:3)
将char
语句中的强制转换移至INSERT
(与character(1)
相同)。一切都应该工作正常。转换为int
也是不必要的。
您可以在psql
中看到这个简单实验会发生什么:
SELECT 'hello'::char;
bpchar
--------
h
(1 row)
投射到character varying
会有效,但没有必要明确投射,因为在INSERT
期间,无论如何都会执行任务投射。
正如the documentation所述:
应用于未加修饰的字符串文字的强制转换表示初始值 将类型赋值为文字常量值,因此它将成功 对于任何类型(如果字符串文字的内容是可接受的输入 数据类型的语法。)