SQL文でクォーテーションによって違いがあるのか調べてみた
auです。
データベースの授業を受けていて、SQL文を書いていたのですが、String型の扱いで気になったことがありました。
使用したのはDB Browser for SQLiteです。
講義の資料のString型はシングルクォーテーション('文字')に対し、友人が書いていたString型はダブルクォーテーション("文字")で書いていました。
C言語や大体の言語では、シングルクォーテーションとダブルクォーテーションに違いがあります。何事もなかったかのように通ったのに、あとでエラーが起きた時の原因がこれと言うこともしばしば・・・
話は戻りますが、友人がSQL文でダブルクォーテーションで書いたのですが、WHERE文で検索できるし、特に問題が内容に見えました。
自分も試しにテーブルを作ってみて、シングルクォーテーションとダブルクォーテーション混合している状態で追記などしてみたのですが、普通にいけるんですよね。
実際に追加したテーブル
普通に通る
Result: query executed successfully. Took 0ms, 1 rows affected At line 1: INSERT INTO grade VALUES ("S5", 'J3', 30);
文字の色違うし違いがあるように見えなくもないですよね。
実際に違いがあるのか調べた
前置きがめちゃめちゃ長くなってしまいましたが、ここからは調査した内容になります。
参考のサイトを見てもらえれば分かるのですが、PostgreSQLでは明確な違いがあるのに対し、MySQLではシングルクォーテーションもダブルクォーテーションも特に違いはありません。どちらも文字です。
ただし、「シングルクォート(')」をデータベースに追加する場合は、エスケープ処理が必要になります。その場合に「ダブルクォーテーション(")」を使って囲むみたいです。若干ややこしいけど、「I'm」といった英語を追加するとなると必須になりますよね。
しかし、これも言語によって違うみたい・・・?
このOracleを使っている記事を読んでもらうと、シングルクォートを組み合わせて文字を表現しているように感じます。 文頭に「q」を使ってやるやり方はOracle特有の動作なのでしょうか?
ちなみに講義で使っているSQLite3では、このようにして追加できました。
create table grate (name VARCHAR(10), text VARCHAR(10)); // テーブル作成 insert into grate values ("I'm", 'a'); // I'mの追記 select * from grate; // テーブルの中身を表示 I'm|a
ダブルクォーテーションで囲むだけでいけましたとさ。