插入带有字符串的数组时,postgresql 查询会出错

Posted

技术标签:

【中文标题】插入带有字符串的数组时,postgresql 查询会出错【英文标题】:postgresql queries give error when inserting arrays with strings 【发布时间】:2016-08-10 11:30:33 【问题描述】:

我有一个简单的查询,打算在我的 postgresql 9.5 数据库的表中插入一行:

client.query('INSERT INTO "GRIDs" (idname, status, playerid, playerready) VALUES (\'' + gameRoomID + '\', 0, ARRAY[\'\',\'\',\'\',\'\'], ARRAY[0,0,0,0]);', function(err, data) 
    if(err) 
        throw new Error('Error inserting game room ID ' + gameRoomID);
    ;
);

但是,由于未知原因,字符串数组 (ARRAY[\'\',\'\',\'\',\'\']) 会导致错误,因为如果我将其从查询中删除相应的 playerid 列,查询工作正常。我尝试了以下变体,结果都相同: ARRAY["\'\'","\'\'","\'\'","\'\'"] (用双引号将每个值括起来) ARRAY["","","",""](只用双引号) ARRAY[,,,](只是空的) 以及花括号的各种类似符号,但即使是编号数组,这些符号似乎也很烦人,所以我倾向于避免使用这些符号。

我做错了什么?

【问题讨论】:

错误信息是什么,playerid列的数据类型是什么? 手动查询转义始终是灾难的根源。您应该依赖库中的自动查询格式。查看pg-promise,它可以自动格式化任何东西(包括混合内容)的数组。 【参考方案1】:

如果这些是字符串数组,你必须声明你的类型。

也可以使用美元引号或双引号。

 ARRAY[''''::text, '''''', ...]

请注意,您的数据库驱动程序应该为您执行此转义操作。自己做这件事是解决 sql 注入问题的好方法。

【讨论】:

非常感谢。美元引用它(导致 ARRAY[$$\'\'$$,$$\'\'$$,$$\'\'$$,$$\'\'$$])解决了这个问题。由于表已经使用 pgAdmin 创建,并且列的数据类型已经是字符变量 [],因此没有必要为每个值分配类型。

以上是关于插入带有字符串的数组时,postgresql 查询会出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgresql 中使用带有数组列的 GIN 索引?

Postgresql:搜索jsonb对象数组时如何使用动态值?

带有准备好的语句的 PostgreSQL 内部查询

如何将带有数组的普通值转换为 PostgreSQL 中的数据结构?

Postgresql - 选择返回时插入

使用 jsonb 数据类型的 PostgreSQL 插入查询