与 postgres uri 和特殊字符的 psql 连接

psql connection with postgres uri and special character

我在 docker 中摆弄 postgres,想通过 url URI 连接到它。

如果密码包含可以转换为字符的子字符串,感谢 decodeURIComponent,它也会被处理,导致连接失败。

是否可以在 uri 中指定一些不应被视为要解码的特殊字符的字符?

这是一个例子:

%23 自动编码为 #

$> docker run --name test -p 5433:5432 -e POSTGRES_USER=user -e POSTGRES_DB=db -e POSTGRES_PASSWORD=secret%23 --rm -d postgres
$> psql postgres://user:secret%23@localhost:5433/db
psql: error: could not connect to server: FATAL:  password authentication failed for user "user"
$> PGPASSWORD=secret%23 psql --user=user --host=localhost --port=5433 --dbname=db
psql (12.3, server 13.2 (Debian 13.2-1.pgdg100+1))
WARNING: psql major version 12, server major version 13.
         Some psql features might not work.
Type "help" for help.
db=# 

工作示例(没有百分比后跟两位数):

$> docker run --name test2 -p 5434:5432 -e POSTGRES_USER=user -e POSTGRES_DB=db -e POSTGRES_PASSWORD=secret# --rm -d postgres
$> psql postgres://user:secret%23@localhost:5434/db
psql (12.3, server 13.2 (Debian 13.2-1.pgdg100+1))
WARNING: psql major version 12, server major version 13.
         Some psql features might not work.
Type "help" for help.
db=# 
$> PGPASSWORD=secret# psql --user=user --host=localhost --port=5434 --dbname=db
psql (12.3, server 13.2 (Debian 13.2-1.pgdg100+1))
WARNING: psql major version 12, server major version 13.
         Some psql features might not work.
Type "help" for help.
db=# 

psql postgres://user:secret%23@localhost:5433/db 不适用于密码设置为 secret%23 但密码设置为 secret#

是否可以像 secret%23 这样使用带有密码的数据库 uri?

doc 表示必须对连接 URI 进行编码,因此您的 %23 值必须编码为 %2523