PostgreSQL 13拒绝创建aws-inventories数据库的原因排查
PostgreSQL创建带连字符数据库的失败原因与解决方法
核心失败原因
- 命令执行场景混淆
createdb是PostgreSQL附带的操作系统层工具,仅能在系统普通终端(非psql交互界面、非PGAdmin查询窗口)执行。psql交互界面中,正常已完成的输入状态提示符为postgres=#,如果进入语句暂存等待状态,提示符会变为postgres-#,此时系统会持续收集输入内容,直到碰到分号才会提交到服务端执行。你在psql的postgres-#提示符、PGAdmin查询窗口里直接运行createdb命令时,程序会把输入内容当成SQL语句解析:在PGAdmin中会直接抛出语法错误,在psql中因为没有触发语句提交,既不会回传报错,也不会执行创建动作,因此既没有报错提示,也看不到新建的数据库。 - 标识符语法规则不匹配
PostgreSQL默认对未加双引号包裹的标识符(数据库名、表名、字段名)有明确规则:仅允许包含字母、数字、下划线,不支持连字符-这类特殊字符。直接写CREATE DATABASE aws-inventories时,解析器会在遇到连字符时判定语法中断,直接抛出语法错误。你在psql中没有看到这个报错,同样是因为语句没有加分号结束、未提交到服务端执行的原因,并非创建成功。
正确操作方式
- 若在系统终端执行
createdb命令:直接在操作系统的命令行(不是进入psql之后)运行以下命令即可,此时的数据库名是作为系统命令的参数传递,不受SQL标识符规则限制:createdb -E UTF8 aws-inventories - 若在psql、PGAdmin的SQL查询界面执行创建:必须用英文双引号将带特殊字符的数据库名包裹,明确告知解析器这是完整的标识符,且语句末尾必须加分号触发执行:
后续切换到该数据库时,也需要用双引号包裹数据库名,否则会报数据库不存在的错误:CREATE DATABASE "aws-inventories" WITH ENCODING 'UTF8';\c "aws-inventories"
内容的提问来源于stack exchange,提问作者bluethundr
相关产品推荐
相关产品推荐

