在 Postgres 中自动引用数组元素


Automatical quoting of array elements in Postgres

我在PostreSQL数组和html表单上遇到了一些麻烦。假设我在网页中有一个文本字段,用户可以在其中编写以逗号分隔的字符串列表,例如名称列表。此列表存储在Postgres数据库中。

当请求页面时,

1)我的php代码用SELECT name_list FROM names;填充文本字段,我得到的是这样的:

|  name_list         |
|____________________|
| {alice,bob,carl}   |
| ....               |
|                    |

2)删除第一个和最后一个字符(括号)以获得可打印的字符串:

..
$arrayWithoutBrackets = substr($row['name_list'], 1,-1);
echo($arrayWithoutBrackets) ---->  alice,bob,carl
..

该字符串是用户可以读取并最终修改并使用简单的 html 表单发送回服务器的内容。

但是,如果用户插入包含空格的名称(如alice,bob,carl,john doe)怎么办?这是更新表后发生的情况:

|  name_list                    |
|_______________________________|
| {alice,bob,carl,"john doe"}   |
| ....                          |
|                               |

Postgres 会自动引用我的字符串,当用户重新加载页面时,他们会看到

alice,bob,carl,"john doe"

alice,bob,carl,john doe

手动搜索引号字符并使用str_replace()删除它们不是一种选择,因为我的应用程序中有许多基于数组的文本字段(数百个)。

有什么办法可以解决这个问题吗?

您看到的双引号只是 Postgres 添加的明确输入/输出的装饰器。您删除前导和尾随大括号的方法非常笨拙。

要获得正确的输出,请使用array_to_string()

SELECT array_to_string(namelist, ', ') AS namelist_raw
FROM   names

SQL 小提琴。

但是请注意,Postgres使用引号是有原因的。如果分隔符字符串(示例中', ')包含在数组的任何元素中,则输出文本不明确。