Edited at

えっ、まだ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の殴り書き備忘録 - はてなブログ