【问题标题】:How to Drop/Create Database name that has upper-case letter?如何删除/创建具有大写字母的数据库名称?
【发布时间】:2014-05-28 07:39:53
【问题描述】:

例如我的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 数据库 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\";"

    below comment

【问题讨论】:

  • 评论你对混合大小写标识符的使用:这是一个很好的例子,为什么你不应该使用它们。

标签: postgresql psql


【解决方案1】:

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

DROP DATABASE  "Ajp";

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

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

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

【讨论】:

  • 还是一样的ERROR: database "ajp" does not exist
  • @user3682599: 那么你没有输入如图所示的语句。消息 "database "ajp" 不存在" 清楚地表示您使用了drop database ajpdrop database "ajp"不是 drop database "Ajp"(注意大写A . 或者另一种选择是 " 不知何故被 Windows 命令行吞没了。如果您在 psql 提示符下输入语句手动会发生什么(而不是通过 -c 传递它)
  • 不,我试过DROP DATABASE "Ajp";see this
  • @user3682599:那么有些事情你没有告诉我们,因为我写的内容肯定会起作用如果你真的有一个数据库名称"Ajp"\lpsql 中为您提供了什么(请将输出添加到您的问题中,不要将其作为评论发布)
  • @user3682599 在 windows 的 cmd.exe(也用于执行批处理文件)上的正确转义是 psql -U postgres -d postgres -c "DROP DATABASE \"Ajp\""
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我相信有人会在使用 PowerShell 时遇到这个问题,它还需要反斜杠和双引号。两者都需要用蜱虫逃脱。 (感谢poz)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2011-04-01
      • 2019-11-25
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多