【问题标题】:Postgresql query returns string values between quotation marks " if it contains any space character or without quotation if it had no space charPostgresql 查询返回引号之间的字符串值 " 如果它包含任何空格字符,或者如果它没有空格字符则不带引号
【发布时间】:2020-05-10 00:57:01
【问题描述】:

所以我遇到了这个奇怪的问题,我不知道是什么原因造成的。我们在 PHP 中使用 Charts.js 来绘制一些图表。我们将创建图表所需的参数存储到 PSQL 表中,以便在需要时加载。

我的问题在于标题、组和标签参数都是字符串数组。它们存储在 text[] 表中。问题是,当我查询图形的参数时,如果数组中的字符串有空格,则在引号之间返回,否则返回为字符串本身。

我有一个关联数组 $graph,它存储图形的参数并用于将值插入数据库:

$cursor = $this->query("
        INSERT INTO data.graphs(region,title,type,section,label,group,values,colors,id_sample)                   
        VALUES(
            '".$graph['local']."',
            '".$graph['title']."',
            '".$graph['type']."',
            '".$graph['section']."',
            '".$graph['label']."',
            '".$graph['group']."',
            '".$graph['values']."',
            '".$graph['colors']."',
            '".$_SESSION['id_sample']."'
        )  
    "); 

插入DB的字符串数组是这样的:

$graph1['label'] = "{Não há material presente,Material presente, mas crianças não usaram,Crianças usaram os materiais}";
$graph2['label'] = "{Boa vista, Rural, Urbana, Indigena}";
$graph3['label'] = "{Boa vista, Ru ral, Urb ana, Ind igena}";

如果我在数据库中查询我的标签,它们看起来像这样:

现在要查询数据,我们对所需的每个图形的参数执行“SELECT *”并再次存储它们的值关联数组(用作 Charts.js 绘图仪的参数)。

$aux = pg_fetch_array($cursor))
print_r($aux['label']);

这就是我的 3 个图表中每一个的标签的样子:

{"Não há material presente","Material presente, mas crianças não usaram","Crianças usaram os materiais"}
{"Boa vista",Urbana,Rural,Indigena}
{"Boa vista","Urb ana","Ru ral","Ind igena"}

所以在数据库中,字符串没有引号,如果一个 qstring 有一个空格,它会在引号之间返回,这还不错,因为我希望我的字符串用引号引起来。

有没有办法强制数组中返回的每个字符串都在引号内?

我已经尝试将这样的数组插入数据库:

$graph['label'] = "{
        \"Boa vista\",
        \"Urbana\",
        \"Rural\",
        \"Indigena\"
    }";

如果我查看数据库,字符串没有引号,它们会再次像上面一样返回。

【问题讨论】:

    标签: php jquery postgresql psql php-pgsql


    【解决方案1】:

    这是text[] 类型的默认text 输出。 The manual:

    数组输出例程会在元素值两边加上双引号 如果它们是空字符串,则包含大括号、分隔符、 双引号、反斜杠或空格,或匹配单词NULL。 嵌入在元素值中的双引号和反斜杠将是 反斜杠转义。
    [...] 对于文本数据类型,应该准备好应对引号的存在或不存在。

    如果您更喜欢所有元素都被双引号括起来的文本表示,您可以使用如下简单的表达式:

    SELECT '"' || array_to_string('{"Boa vista",Urbana,Rural,Indigena}'::text[], '", "') || '"'
    

    如果你需要它很多,考虑一个(简单的)函数:

    CREATE OR REPLACE FUNCTION f_array_to_string_with_quotes(_arr text[], _quote text = '"')
      RETURNS text LANGUAGE sql IMMUTABLE PARALLEL SAFE AS
    $func$
    SELECT $2 || array_to_string($1, $2 || ', ' || $2) || $2
    $func$;
    

    呼叫:

    SELECT f_array_to_string_with_quotes('{"Boa vista",Urbana,Rural,Indigena}', '"');
    
    | f_array_to_string_with_quotes | | :-------------------------------------------------------- | | “Boa vista”、“Urbana”、“Rural”、“Indigena” |

    dbfiddle here - 更多示例

    注意现在生成的类型是text,而不是text[]!而且它没有正确地逃避任何东西,因此“简单化”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-20
      • 2017-10-01
      • 1970-01-01
      • 2013-01-17
      • 2015-08-25
      • 2020-10-08
      • 2018-05-05
      • 2020-10-03
      相关资源
      最近更新 更多