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

时间:2014-05-28 07:39:53

标签: postgresql psql

例如,我的Postgresql数据库名称为Ajp

我无法使用此名称删除/创建数据库,即。 Ajp

我的drop脚本是

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 \ bin \ Debug \ PG> psql -U postgres -d postgres -c“DR   OP DATABASE Ajp“   错误:数据库“ajp”不存在

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

再次出现错误

  

错误:“'Ajp'或附近的语法错误”   第1行:DROP DATABASE'AJp'

如何解决这个问题? (请不要评论change your dbname to lower-case

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

此问题的解决方案低于

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

    请参阅below comment

3 个答案:

答案 0 :(得分:31)

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

DROP DATABASE  "Ajp";

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我相信有人会在使用 PowerShell 时遇到这个问题,这也需要反斜杠和双引号。两者都需要通过勾号转义。 (感谢 pozs)

(从 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"