PostgreSQL / 简短指南

如何在 PostgreSQL 中使用单引号和双引号

分享到

简介

单引号和双引号在 PostgreSQL 中用于不同的目的。在开始使用这些数据库时,可能难以理解这两种引号之间的区别以及如何正确使用它们。

在本指南中,我们将了解 PostgreSQL 如何解释单引号和双引号。我们将讨论使用各种引号的副作用,并提供每个引号使用场景的示例。

双引号

在 PostgreSQL 中,双引号(例如 "a red dog")始终用于表示分隔标识符。在这种情况下,标识符是 PostgreSQL 中对象的名称,例如表名或列名。分隔标识符是具有特定标记的开头和结尾的标识符。

例如,要从 customer 表中选择所有信息,您可以键入以下内容。这里,表名用双引号括起来。

SELECT * FROM "customer";

虽然双引号表示标识符,但并非所有标识符都使用双引号。对于上面的示例,更常见的是完全不使用引号来表示标识符。

SELECT * FROM customer;

引用标识符和大小写敏感问题

虽然上面使用的两种格式在 customer 表上都能正常工作,但它们之间确实存在重要差异。

未加引号的标识符(如第二个版本)不区分大小写。这意味着 PostgreSQL 将识别 customerCustomerCUSTOMER 作为同一个对象。

但是,带引号的标识符区分大小写。这会导致 PostgreSQL 将 "CUSTOMER""customer" 视为完全不同的对象。

这种差异允许您创建在 PostgreSQL 中原本不合法但您需要的标识符。例如,如果您需要创建一个包含句点的列,则需要使用双引号才能使 PostgreSQL 正确解释它。

但是,请记住,如果使用不当,这会导致可用性问题。例如,假设您在创建对象时使用双引号来保留标识符中的大写字符。从那时起,您将需要每次引用它时都使用双引号来匹配该大小写。

为了更好地兼容性,尤其是在创建对象时,请谨慎使用双引号。如果您想使用双引号,请记住,如果您对完全小写的标识符使用双引号,大小写问题就不会出现。

单引号

另一方面,单引号用于表示标记是一个字符串。这在 PostgreSQL 中的许多不同上下文中使用。

一般来说,如果一个项目是字符串,则需要用单引号将其括起来。请记住,在创建和引用对象时,标识符必须用未加引号或双引号括起来的文本表示。

例如,这里我们使用单引号将字符串插入数据库中的 text 字段中。

INSERT INTO my_table(text) VALUES ('hello there!');

如果我们愿意,可以选择在标识符周围使用双引号,如下所示。

INSERT INTO "my_table"("text") VALUES ('hello there!');

上面两个语句是相同的,假设 my_tabletext 列在创建时都未加引号或为小写。

如果您需要在字符串中包含单引号,您可以通过插入两个连续的单引号来实现(两个单引号,而不是双引号)。

例如,您可以通过键入以下内容来插入包含嵌入式单引号的另一个字符串。

INSERT INTO my_table(text) VALUES ('How''s it going?');

单引号字符串是分配或检查字符串值的适当方法。

其他示例

这里,我们将介绍一些额外的示例,以帮助澄清为什么 SQL 语句的不同部分使用不同的引用方法。

创建具有密码的新角色

首先,我们可以看一下角色创建语句。

CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';

该语句包含两个带引号的组件。

  • user1 位于双引号内,因为它将引用一个角色,该角色是一个标识符。
  • secretpassword 是一个将在表列中存在的字符串。因此,它是一个字符串值,需要单引号。

检查当前用户是否拥有管理角色所需的权限

下一个查询将确定用户当前登录的角色是否拥有在数据库集群中管理角色的权限。

SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);

这里有几种不同的引号模式。

  • Yes 用单引号括起来,因为它是在列值的上下文中打印的值。
  • Can I manage roles? 用双引号括起来,因为它将是构造表中列的名称,因此是一个标识符。
  • USER 用单引号括起来,因为我们正在检查字符串的值。
  • :'USER' 语法是用于插值 psql USER 变量的特殊格式,同时将结果值放在单引号中。

结论

在本指南中,我们介绍了 PostgreSQL 中的单引号和双引号。双引号用于指示数据库中的标识符,这些标识符是诸如表、列名称和角色之类的对象。相反,单引号用于指示字符串文字。

学习如何在 PostgreSQL 中正确使用引号,以及不同引号选择的影响,将帮助您避免令人沮丧的错误。虽然引号规则可能与您可能熟悉的其他系统不一致,但一旦您了解了它们的独特用途,它们将非常有用。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年起就开始撰写有关数据库、Linux、基础架构和开发工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。