在 PostgreSQL 中轉義單引號

Joy Idialu 2023年1月30日 2022年6月13日
  1. 在 PostgreSQL 中轉義單引號
  2. 在 PostgreSQL 中使用另一個單引號轉義一個單引號
  3. 在 PostgreSQL 中使用反斜槓轉義單引號
  4. 在 PostgreSQL 中通過美元引號轉義單引號
在 PostgreSQL 中轉義單引號

本教程討論如何在 PostgreSQL 查詢中轉義單引號。

在 PostgreSQL 中轉義單引號

考慮一個記錄使用者評論的評論表。該表有 5 個欄位:iduseridpostidcommentscommentdate,如下所示:

|id | userid  | postid  | comments                       | commentdate
|---|-------- |---------|--------------------------------|---------------------
|1  | 1       |  1      | The post is great              | 07-02-2022 11:03:05
|2  | 2       |  1      | We've found the right post     | 07-02-2022 01:17:02
|3  | 3       |  3      | I'm working on a related post  | 08-02-2022 09:12:17
|4  | 4       |  3      | Excellent post                 | 08-02-2022 12:04:01
|5  | 5       |  4      | The post's title is impressive | 09-02-2022 16:23:09

我們將在上面的示例中建立表。這是評論表的 CREATE 語句:

CREATE TABLE comments
(
    id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
    userid INT NOT NULL,
    postid INT NOT NULL,
    comments TEXT NOT NULL,
    commentdate TIMESTAMP NOT NULL,
    CONSTRAINT comment_pkey PRIMARY KEY (id)
)

建立表後,我們將在上面示例的第一行中插入值。下面是第一行的 INSERT 語句:

INSERT INTO comments (userid, postid, comments, commentdate)
VALUES (1, 1, 'The post is great', '07-02-2022 11:03:05');

此查詢插入成功。

接下來,讓我們在第二行中插入值。下面是 INSERT 語句:

INSERT INTO comments (userid, postid, comments, commentdate)
VALUES (2, 1, 'We've found the right post', '07-02-2022 01:17:02');

當我們嘗試執行上面的語句時,會丟擲一個語法錯誤,如下所示:

ERROR:  syntax error at or near "ve"
LINE 1: ... postid, comments, commentdate) VALUES (2, 1, 'We've found t...

PostgreSQL 無法理解 We 之後的單詞,因為它假定 We 後的單引號表示字串的結尾。第 3 行和第 5 行將給出類似的錯誤,因為它們在 comments 欄位中都有單引號。

下面是插入示例中所有行的語句:

INSERT INTO comments (userid, postid, comments, commentdate)
VALUES
    (1, 1, 'The post is great', '07-02-2022 11:03:05'),
    (2, 1, 'We've found the right post', '07-02-2022 01:17:02'),
    (3, 3, 'I'm working on a related post', '08-02-2022 09:12:17'),
    (4, 3, 'Excellent post', '08-02-2022 12:04:01'),
    (5, 4, 'The post's title is impressive', '09-02-2022 16:23:09');

上面的語句將給出與僅插入第二行時的錯誤相同的錯誤。

解決此問題的一種方法是轉義單引號,這可以通過以下方式完成:

  1. 另一個單引號
  2. 反斜槓
  3. 美元引號

在 PostgreSQL 中使用另一個單引號轉義一個單引號

可以通過編寫單引號後跟要轉義的單引號以轉義形式指定單引號。此解決方案顯示在這裡:

INSERT INTO comments (userid, postid, comments, commentdate)
VALUES (2, 1, 'We''ve found the right post', '07-02-2022 01:17:02');

將上述語句中的所有單引號轉義的語句如下所示:

INSERT INTO comments (userid, postid, comments, commentdate)
VALUES
    (1, 1, 'The post is great', '07-02-2022 11:03:05'),
    (2, 1, 'We''ve found the right post', '07-02-2022 01:17:02'),
    (3, 3, 'I''m working on a related post', '08-02-2022 09:12:17'),
    (4, 3, 'Excellent post', '08-02-2022 12:04:01'),
    (5, 4, 'The post''s title is impressive', '09-02-2022 16:23:09');

輸出:

|id | userid  | postid  | comments                       | commentdate
|---|-------- |---------|--------------------------------|---------------------
|1  | 1       |  1      | The post is great              | 07-02-2022 11:03:05
|2  | 2       |  1      | We've found the right post     | 07-02-2022 01:17:02
|3  | 3       |  3      | I'm working on a related post  | 08-02-2022 09:12:17
|4  | 4       |  3      | Excellent post                 | 08-02-2022 12:04:01
|5  | 5       |  4      | The post's title is impressive | 09-02-2022 16:23:09

在 PostgreSQL 中使用反斜槓轉義單引號

要使用反斜槓轉義單引號,你必須在字串之前放置 E 符號,這是我們示例中的註釋,並在要轉義的單引號之前放置反斜槓,如下所示:

INSERT INTO comments (userid, postid, comments, commentdate)
VALUES
    (1, 1, 'The post is great', '07-02-2022 11:03:05'),
    (2, 1, E'We\'ve found the right post', '07-02-2022 01:17:02'),
    (3, 3, E'I\'m working on a related post', '08-02-2022 09:12:17'),
    (4, 3, 'Excellent post', '08-02-2022 12:04:01'),
    (5, 4, E'The post\'s title is impressive', '09-02-2022 16:23:09');

輸出:

|id | userid  | postid  | comments                       | commentdate
|---|-------- |---------|--------------------------------|---------------------
|1  | 1       |  1      | The post is great              | 07-02-2022 11:03:05
|2  | 2       |  1      | We've found the right post     | 07-02-2022 01:17:02
|3  | 3       |  3      | I'm working on a related post  | 08-02-2022 09:12:17
|4  | 4       |  3      | Excellent post                 | 08-02-2022 12:04:01
|5  | 5       |  4      | The post's title is impressive | 09-02-2022 16:23:09

在 PostgreSQL 中通過美元引號轉義單引號

如果你想要一個更具可讀性的解決方案,特別是當存在多個單引號時,可以使用美元引號。

如果字串中有更多單引號,則美元引號可以使解決方案可讀。美元引用使用美元符號、可選標記、字串(在本例中為註釋),然後是另一個美元符號、可選標記和結束美元符號。

單引號可以在用美元引用的字串中使用,而不會被轉義。可以使用美元引用插入一行,如下所示:

INSERT INTO comments (userid, postid, comments, commentdate)
VALUES (6, 5, $$'I've shared the post. It's quite impressive'$$, '09-02-2022 16:34:17')

這是官方文件以瞭解有關 PostgreSQL 字串常量及其轉義的更多資訊。

相關文章 - PostgreSQL String