45
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-08-08

##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を使うべきだなあと感じました。

45
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?