1. ホーム
  2. mysql

[解決済み] MySQLでシングルクォート、ダブルクォート、バックスティックを使用する場合

2022-03-14 13:25:22

質問

クエリの書き方を勉強しているところです。また、一貫性を保つことの重要性も理解しています。今までは、特に考えずにシングルクォート、ダブルクォート、バックスティックを適当に使っていました。

$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';

また、上記の例で、次のように考えてみましょう。 table , col1 , val1 などが変数になる可能性があります。

これの基準は何ですか?どうするんですか?

<サブ ここで似たような質問に対する回答を20分ほど読みましたが、この質問に対する決定的な回答はないようです。

どのように解決するのですか?

バックティックはテーブルとカラムの識別子に使用されますが、識別子が MySQL予約キーワード カラムやテーブルの識別子として予約キーワードを使用することは、 クォートの問題を避けるため、可能な限り避けることが推奨されます。

のような文字列値には一重引用符を使用します。 VALUES() というリストがあります。 MySQL では文字列値に対してダブルクォートもサポートされていますが、他の RDBMS ではシングルクォートの方が広く受け入れられているので、ダブルクォートではなくシングルクォートを使用するのは良い習慣です。

また、MySQLは DATEDATETIME のような文字列としてシングルクォートされるリテラル値。 '2001-01-01 00:00:00' . 相談する 日付と時刻の文字 のドキュメントを参照してください。 - を日付文字列のセグメントデリミタとして使用します。

ですから、この例では、PHP の文字列をダブルクォートし、値をシングルクォートで囲みます。 'val1', 'val2' . NULL は MySQL キーワードであり、特別な(非)値であるため、引用符で囲まれていません。

これらのテーブルやカラムの識別子はいずれも予約語ではありませんし、クォートを必要とする文字も使用していませんが、とりあえずバックティックでクォートしておきました(これについては後述します...)。

RDBMSにネイティブな関数(例えば。 NOW() の場合) は引用してはいけません。ただし、その引数には、すでに述べたのと同じ文字列や識別子の引用ルールが適用されます。

バックチック (`)
table & column ─────────────────┬──────────┬─────┬──────┬──────────┬────────┘┘
                      
$query = "

INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) 
                       VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())

"。
                               ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 
引用されていないキーワード ────┴┴┘ │ │ │ │ │ │ │ │ │ │
一重引用符(')文字列 ────────────┴───────┘ │ ││││││││││││││││││││││││││││││││││││││││││││││││││││││││││││││││││。
シングルクォート(')DATE ──────────────┴────────────┘│││││││││││││││││││││││││││││││││。
引用されていない関数 ────────────────────────────────────────────────────┘┴┴┴.   

変数補間

変数のクォートパターンは変わりませんが、 変数を直接文字列に挿入する場合は、PHP ではダブルクォートで記述する必要があります。SQLで使用するために変数を適切にエスケープしていることを確認してください。( SQLインジェクション対策として、プリペアドステートメントをサポートするAPIを使用することをお勧めします。 ).

// 同じことをいくつかの変数の置き換えで
// ここでは、変数テーブル名 $table はバックチッ ククオート、変数
VALUES リスト中の // はシングルクォートで表示されます。
クエリ = "INSERT INTO 

テーブル

 (`id`, `col1`, `col2`, `date`) VALUES (NULL, 

'$val1'

, 

'$val2'

, 

'$date'

)"。

プリペアドステートメント

プリペアドステートメントを使用する場合、ステートメントのプレースホルダーを引用する必要があるかどうかについては、ドキュメントを参照してください。 PHP で使用可能な最も一般的な API である PDO および MySQLi では、以下のようなことが想定されています。 非クォート プレースホルダーは、他の言語のほとんどのプリペアドステートメントAPIと同じです。

// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";

// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";

識別子でバックチッ ククオートを必要とする文字。

MySQLのドキュメントによると の場合、以下の文字セットで識別子をクォート(バックティック)する必要はありません。

<ブロッククオート

ASCIIです。 [0-9,a-z,A-Z$_] (基本的なラテン文字、数字0-9、ドル、アンダースコア)

テーブルやカラムの識別子として、例えば空白を含む、このセット以外の文字を使用することもできますが、その場合は しなければならない を引用(バックティック)してください。

また、数字は識別子として有効な文字ですが、数字だけで識別子を構成することはできません。その場合は、バックティックで囲む必要があります。