简介
在 PostgreSQL 中,单引号和双引号用于不同的目的。刚开始使用这些数据库时,可能很难理解这两种引号之间的区别以及如何正确使用它们。
在本指南中,我们将探讨 PostgreSQL 如何解释单引号和双引号。我们将讨论使用不同引号的副作用,并提供每个引号使用场景的示例。
双引号
在 PostgreSQL 中,双引号(如 "a red dog")始终用于表示_分隔符标识符_。在此上下文中,_标识符_是 PostgreSQL 中对象的名称,例如表名或列名。分隔符标识符是具有特定标记的开头和结尾的标识符。
例如,要从 customer 表中选择所有信息,您可以键入以下内容。此处,表名用双引号括起来。
SELECT * FROM "customer";
虽然双引号表示标识符,但并非所有标识符都使用双引号。对于上述示例,更常见的是完全不带引号的标识符。
SELECT * FROM customer;
引用标识符和大小写敏感问题
虽然上面使用的两种格式都适用于 customer 表,但它们_之间存在_重要差异。
不带引号的标识符(如第二个版本)是_不区分大小写_的。这意味着 PostgreSQL 会将 customer、Customer 和 CUSTOMER 识别为同一个对象。
但是,带引号的标识符是_区分大小写_的。这导致 PostgreSQL 将 "CUSTOMER" 和 "customer" 视为完全不同的对象。
这种差异允许您创建否则在 PostgreSQL 中不合法的标识符。例如,如果需要创建包含句点的列,则需要使用双引号,以便 PostgreSQL 正确解释它。
但是,请记住,如果不小心使用,这可能会导致可用性问题。例如,假设您在创建对象时使用双引号来保留标识符中的大写字符。从那时起,您将被要求每次引用它时都使用双引号来匹配该大小写。
为获得更好的兼容性,请谨慎使用双引号,尤其是在创建对象时。如果要使用双引号,请记住,如果将双引号与完全小写的标识符一起使用,则不会出现大小写问题。
单引号
另一方面,单引号用于指示标记是字符串。这在 PostgreSQL 的许多不同上下文中都有使用。
通常,如果一个项是字符串,它需要用单引号括起来。请记住,在创建和引用对象时,标识符必须用不带引号或带双引号的文本表示。
例如,这里我们使用单引号将字符串插入到数据库中的 text 字段中。
INSERT INTO my_table(text) VALUES ('hello there!');
如果我们愿意,可以选择在标识符周围使用双引号,如下所示:
INSERT INTO "my_table"("text") VALUES ('hello there!');
上面的两个语句是相同的,假设 my_table 和 text 列在创建时都没有引号或都是小写的。
如果需要在字符串_中_包含单引号,可以通过插入两个连续的单引号(两个单引号,而不是一个双引号)来实现。
例如,您可以通过键入以下内容插入另一个带有嵌入式单引号的字符串:
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'语法是一种特殊格式,用于在将结果值放在单引号中的同时插入psqlUSER变量。
结论
在本指南中,我们探讨了 PostgreSQL 中的单引号和双引号。双引号用于指示数据库中的标识符,这些标识符是表、列名和角色等对象。相反,单引号用于指示字符串文字。
学习如何在 PostgreSQL 中正确使用引号,以及不同引号选择的含义,将帮助您避免令人沮丧的错误。虽然引用规则可能与您熟悉的其他系统不符,但一旦您了解它们的独特用途,它们就会非常有用。
如果您正在使用 Prisma 来管理您的 PostgreSQL 数据库,引号类型会在发送到数据库之前自动解析。例外情况是,如果您正在使用 原始查询,在这种情况下,您需要注意此处介绍的信息,以避免混淆 PostgreSQL 如何解释不同类型的引号。
