簡介
在 PostgreSQL 中,單引號和雙引號用於不同的目的。當開始使用這些資料庫時,可能難以理解這兩種引號類型之間的差異以及如何正確使用它們。
在本指南中,我們將了解 PostgreSQL 如何解讀單引號和雙引號。我們將討論使用各種引號的副作用,並提供範例說明每種引號的使用情境。
雙引號
在 PostgreSQL 中,雙引號(例如 "a red dog")始終用於表示定界識別符。在此上下文中,識別符是 PostgreSQL 中物件的名稱,例如表格名稱或欄位名稱。定界識別符是具有明確標記的開頭和結尾的識別符。
例如,若要從 customer
表格中選取所有資訊,您可以輸入以下內容。此處,表格名稱以雙引號括住。
SELECT * FROM "customer";
雖然雙引號表示識別符,但並非所有識別符都使用雙引號。對於上述範例,更常見的是完全不使用引號的識別符
SELECT * FROM customer;
識別符的引號和區分大小寫的問題
雖然上面使用的兩種格式對於 customer
表格都能正確運作,但確實存在重要差異。
不使用引號的識別符(例如第二種版本)不區分大小寫。這表示 PostgreSQL 會將 customer
、Customer
和 CUSTOMER
識別為相同的物件。
但是,使用引號的識別符區分大小寫。這導致 PostgreSQL 將 "CUSTOMER"
和 "customer"
視為完全不同的物件。
此差異可讓您建立在 PostgreSQL 中原本不合法的識別符。例如,如果您需要建立包含句點的欄位,則需要使用雙引號,以便 PostgreSQL 正確解讀它。
但是,請記住,如果不小心使用,可能會導致可用性問題。例如,假設您在使用雙引號建立物件時,使用雙引號來保留識別符中的大寫字元。從那時起,每次您參考它時,都必須使用雙引號來符合該大小寫。
為了獲得更好的相容性,特別是在建立物件時,請謹慎使用雙引號。如果您想使用雙引號,請記住,如果您將雙引號與完全小寫的識別符一起使用,則不會出現大小寫問題。
單引號
另一方面,單引號用於表示 Token 是字串。這在整個 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'
語法是一種特殊格式,用於在將結果值置於單引號中時,內插psql
USER
變數。
結論
在本指南中,我們了解了 PostgreSQL 中的單引號和雙引號。雙引號用於表示資料庫中的識別符,這些識別符是表格、欄位名稱和角色等物件。相反地,單引號用於表示字串文字。
學習如何在 PostgreSQL 中正確使用引號,以及不同引號選擇的含義,將有助於您避免令人沮喪的錯誤。雖然引號規則可能與您熟悉的其他系統不符,但一旦您了解它們的獨特用途,它們就會很有用。
如果您使用 Prisma 來管理您的 PostgreSQL 資料庫,則引號類型會在傳送到資料庫之前自動解析。唯一的例外是如果您使用原始查詢,在這種情況下,您會希望注意此處涵蓋的資訊,以避免混淆 PostgreSQL 如何解讀不同類型的引號。