auの日記

プログラミング初心者の日記。(auはハンドルネームです)

SQL文でクォーテーションによって違いがあるのか調べてみた

auです。

データベースの授業を受けていて、SQL文を書いていたのですが、String型の扱いで気になったことがありました。

使用したのはDB Browser for SQLiteです。

講義の資料のString型はシングルクォーテーション('文字')に対し、友人が書いていたString型はダブルクォーテーション("文字")で書いていました。

C言語や大体の言語では、シングルクォーテーションとダブルクォーテーションに違いがあります。何事もなかったかのように通ったのに、あとでエラーが起きた時の原因がこれと言うこともしばしば・・・

話は戻りますが、友人がSQL文でダブルクォーテーションで書いたのですが、WHERE文で検索できるし、特に問題が内容に見えました。

自分も試しにテーブルを作ってみて、シングルクォーテーションとダブルクォーテーション混合している状態で追記などしてみたのですが、普通にいけるんですよね。

実際に追加したテーブル
f:id:program-shoshinsya:20191016164707p:plain

普通に通る

Result: query executed successfully. Took 0ms, 1 rows affected
At line 1:
INSERT INTO grade VALUES ("S5", 'J3', 30);

文字の色違うし違いがあるように見えなくもないですよね。





実際に違いがあるのか調べた

前置きがめちゃめちゃ長くなってしまいましたが、ここからは調査した内容になります。

結論から言うと、SQLDBMSによると言うことです。

参考のサイトを見てもらえれば分かるのですが、PostgreSQLでは明確な違いがあるのに対し、MySQLではシングルクォーテーションもダブルクォーテーションも特に違いはありません。どちらも文字です。

ただし、「シングルクォート(')」をデータベースに追加する場合は、エスケープ処理が必要になります。その場合に「ダブルクォーテーション(")」を使って囲むみたいです。若干ややこしいけど、「I'm」といった英語を追加するとなると必須になりますよね。

しかし、これも言語によって違うみたい・・・?

hensa40.cutegirl.jp

この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

ダブルクォーテーションで囲むだけでいけましたとさ。