Help us understand the problem. What is going on with this article?

えっ、まだPostgreSQLでダブルクォーテーション使ってるの?

PosterSQLでは文字定数を「”」で括るとエラー

PostgreSQLで既存のテーブルにデータを挿入するために、以下のクエリ文を実行しました。

INSERT INTO table_name VALUES ("value1", "value2", "value3"); 

するとこれ、エラーで返ってきました。

(エラーメッセージはうろ覚えですが「value1なんてカラムは存在しないよ」的なことを言ってました)

PostgreSQLでは、ダブルクォーテーション「”」をシングルクォーテーション「'」にしないといけません。なので、以下のように変更します。

-- ダブルクォーテーションをシングルクォーテーションに変更
INSERT INTO table_name VALUES ('value1', 'value2', 'value3'); 

「”」と「’」の違い

PostgreSQLなどの標準SQLでは、

  • シングルクォーテーションで囲う:文字列定数として扱う

  • ダブルクォーテーションで囲う:カラム名として扱う

という仕様になっている。

'value1'value1という文字列として捉え、"value1"value1というカラムの名前として捉えられます。

テーブルになにか文字列を挿入するときはシングルクォーテーションで囲ってやらないと、SQLが文字列として認識してくれないわけです。

つまり、文字列定数をダブルクォーテーションで囲うな!ということです。

一方MySQLでは…

世の中に存在するほとんどのDBMS(Database Management System)はこの標準SQLの仕様に従います。
しかしMySQLだけは独自の仕様を持っています。MySQLでは、

  • シングルクォーテーション「'」で囲う:文字列定数として扱う

  • ダブルクォーテーション「"」で囲う:文字列定数として扱う

  • バッククォート「`」で囲う:カラム名として扱う
    という仕様になっています。

シングルクォーテーションだろうがダブルクォーテーションだろうが、どっちで囲っても文字列定数として認識されます。カラム名として認識してほしいときはバッククォートを使わないといけません。

雑感

私が初めて触ったDBMSはMySQLだったため、「”」と「’」の違いなんて全く気にしていませんでした。DBを初めて勉強するときは標準SQLの仕様に沿ったDBMSを使うべきだなあと感じました。

さいごに

実はこの記事はブログからの再録です。ブログでは他のことについても投稿しています。

社会人1年目SEの殴り書き備忘録 - はてなブログ
Sirloin
社会人三年目。Atcoder茶。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away