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

编写Bash脚本时,PostgreSQL密码是否允许使用单/双引号?

嘿,刚好之前处理过类似的场景,来给你明确答案——PostgreSQL完全允许密码里包含单引号和双引号,下面给你掰扯清楚合法性依据和脚本里的处理技巧:

PostgreSQL密码中的单引号与双引号:合法性及脚本处理指南

一、合法性的官方依据

PostgreSQL对密码的字符限制非常宽松,官方文档明确说明:密码本质是任意字符串,除了空字符串之外没有其他字符限制——单引号、双引号、特殊符号、空格这类都可以正常使用。

官方核心描述:Passwords can include any character except a null character.

只要你在设置密码时正确处理转义(比如在psql命令行里设置时,单引号需要用两个单引号转义),PostgreSQL都会正常存储并识别这个密码。

二、Bash脚本中处理这类密码的实用技巧

因为你是在Bash脚本里操作,重点要解决Shell的语法解析问题,避免把密码里的引号当成脚本的语法标记。这里给几个靠谱的处理方式:

  • 用单引号包裹密码(适用于不含单引号的密码)
    如果你的密码只有双引号,没有单引号,直接用单引号把整个密码括起来就可以,Shell不会解析单引号内部的特殊字符:

    PG_PASSWORD='my"secure"pass123'
    psql "host=localhost dbname=mydb user=myuser password=$PG_PASSWORD"
    
  • 转义特殊字符(适用于同时含单双引号的密码)
    如果密码里既有单引号又有双引号,你需要用反斜杠\对Shell特殊字符进行转义:

    # 单引号包裹时,内部的单引号需要用两个单引号转义
    PG_PASSWORD='my''pass"123'
    # 或者用双引号包裹,内部的双引号和单引号分别转义
    PG_PASSWORD="my\'pass\"123"
    
  • 用环境变量传递(最安全推荐)
    PostgreSQL支持通过PGPASSWORD环境变量传递密码,这种方式可以完全避免Shell解析密码里的特殊字符,是最稳妥的做法:

    # 用单引号拼接的方式处理内部的单引号
    export PGPASSWORD='my'"'"'pass"123'
    # 直接连接数据库,不需要在命令行写密码
    psql -h localhost -d mydb -U myuser
    

    或者用Here文档来设置变量,彻底省去转义的麻烦:

    # Here文档里的内容会被原样读取,不需要转义
    read -r PGPASSWORD << 'EOF'
    my'pass"123!@#$%
    EOF
    export PGPASSWORD
    psql -h localhost -d mydb -U myuser
    

三、快速验证方法

如果你不确定某个密码是否能正常使用,可以直接用psql命令测试连接:

# 注意命令行里的单引号需要用两个单引号转义
psql "host=localhost dbname=mydb user=myuser password='my''pass\"123'"

如果能成功连接,就说明这个密码是完全合法的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:08