如何删除/创建包含大写字母的数据库名称?

问题描述 投票:0回答:4

例如我的

Postgresql
数据库名称是
Ajp

我无法删除/创建具有此名称的数据库,即。

Ajp

我的放置脚本是

cd /D D:\\Apps
cd RSTAR PGSQL DOTCONNECT
cd bin
cd Debug
cd PG
psql -U postgres  -d postgres -c "DROP DATABASE  Ajp "

执行此操作时我收到此错误

D:\Apps\RSTAR PGSQL DOTCONNECT in\Debug\PG>psql -U postgres -d postgres -c "DR OP数据库Ajp“ 错误:数据库“ajp”不存在

我尝试了

psql -U postgres  -d postgres -c "DROP DATABASE  'Ajp' "
(引号内的数据库名称)

又出错了

错误:“'Ajp'”处或附近有语法错误 第 1 行:删除数据库“Ajp”

如何解决这个问题? (请不要评论

change your dbname to lower-case

using : "PostgreSQL 9.2.4, compiled by Visual C++ build 1600, 32-bit"

此问题的解决方案如下

  • 应使用转义字符
    \
  • psql -U postgres -d postgres -c "DROP DATABASE \"Ajp\";"

    请参阅下面的评论

postgresql psql
4个回答
56
投票

区分大小写的 SQL 标识符需要用双引号括起来:

DROP DATABASE  "Ajp";

如果您通过命令行传递它们,则不确定它们是否在 Windows 上正确保留。

您可能需要将其放入 SQL 脚本中并将脚本名称传递给 psql。

有关有效标识符的详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


1
投票

我确信有人会使用 PowerShell 遇到这个问题,这也需要反斜杠和双引号。两者都需要通过勾选来逃脱。 (谢谢波兹)

(从 Xml 配置文件读取)

$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
[xml]$config = Get-Content -Path "$PSScriptRoot\Installer\Config\install.config.xml"
$securePass = Read-Host "Enter password for postgres account" -AsSecureString
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
$pgPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
$env:PGPASSWORD = $pgPass
# Skip to here for usage:
$dropDbCmd = "DROP DATABASE IF EXISTS `\`"" + $config.Settings.dbName + "`\`";"
.\psql.exe -c $dropDbCmd -d "postgres" -p $config.Settings.dbPort -U "postgres"

0
投票

这是一个老问题,但是,它可能对其他人有帮助。 试试这个:

echo "CREATE DATABASE \\"DataBaseName\\" ;" | psql --host=xxxx.postgres.database.azure.com --port=5432 --username=xxxx@xxxx --dbname=postgres

0
投票

你试过这个吗?

psql -U postgres  -d postgres -c "DROP DATABASE  ""Ajp"" "
© www.soinside.com 2019 - 2024. All rights reserved.