You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell中为Unix域套接字连接指定正确的libpq连接字符串URL

解决libpq连接字符串问题

问题背景

已编译libpq示例程序:

gcc test.c -L/usr/local/pgsql15/lib -I/usr/local/pgsql15/include -lpq

尝试多个连接字符串均失败,报错始终指向默认Unix套接字/tmp/.s.PGSQL.5432,提示文件不存在。数据库实例的postgresql.conf相关配置如下:

unix_socket_directories = '/tmp'        # comma-separated list of directories
#unix_socket_group = ''                 # (change requires restart)
unix_socket_permissions = 0777          # begin with 0 to use octal notation

之前尝试的错误连接字符串:

  • ./a.out postgresql:///test15?host=/tmp&port=5415
  • ./a.out postgresql://test15?host=/tmp:5415
  • ./a.out postgresql://test15?host=/tmp&port='5415'
  • ./a.out postgresql://test15?host=/tmp:'5415'
  • ./a.out postgresql://test15?host=/tmp&port=/tmp
  • ./a.out postgresql:///tmp:5415/test15?

正确的连接字符串

以下两种格式均可成功连接:

1. URL格式(推荐)

./a.out "postgresql:///test15?host=/tmp&port=5415"

注意:必须用引号包裹参数,避免shell将&解析为后台执行符号,导致端口参数丢失。

2. 键值对格式

./a.out "host=/tmp port=5415 dbname=test15"

失败原因分析

  • 部分格式混淆了Unix套接字路径与端口的写法,将两者拼接在一起(如host=/tmp:5415),libpq无法正确解析
  • 给端口添加单引号会导致libpq将引号视为端口号的一部分,解析失败
  • 未用引号包裹参数时,&被shell截断,程序仅收到host=/tmp部分,默认使用5432端口,与实际数据库端口不匹配
  • 错误地将Unix套接字路径放在URL的主机位置(如postgresql:///tmp:5415/test15?),套接字路径需通过host参数指定,不能直接替换URL中的主机字段

内容的提问来源于stack exchange,提问作者jian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:11:07