PostgreSQL で一重引用符をエスケープする

Joy Idialu 2023年1月30日
  1. PostgreSQL で一重引用符をエスケープする
  2. PostgreSQL で別の単一引用符を使用して単一引用符をエスケープする
  3. PostgreSQL でバックスラッシュを使用して一重引用符をエスケープする
  4. PostgreSQL でのドル見積もりによる単一見積もりの​​エスケープ
PostgreSQL で一重引用符をエスケープする

このチュートリアルでは、PostgreSQL クエリで一重引用符をエスケープする方法について説明します。

PostgreSQL で一重引用符をエスケープする

ユーザーのコメントを追跡するコメントテーブルについて考えてみます。このテーブルには、次のように、iduseridpostidcommentscommentdate の 5つのフィールドがあります。

|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');

このクエリは正常に挿入されます。

次に、2 行目に値を挿入しましょう。以下は 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 は、すべてコメントフィールドに一重引用符が含まれているため、同様のエラーが発生します。

以下は、例のすべての行を挿入するステートメントです。

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');

上記のステートメントでは、2 行目のみを挿入した場合のエラーと同じエラーが発生します。

これを解決する方法は、一重引用符をエスケープすることです。これは、次の方法で実行できます。

  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