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