[解決済み] MySQLでシングルクォート、ダブルクォート、バックスティックを使用する場合
質問
クエリの書き方を勉強しているところです。また、一貫性を保つことの重要性も理解しています。今までは、特に考えずにシングルクォート、ダブルクォート、バックスティックを適当に使っていました。
例
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
また、上記の例で、次のように考えてみましょう。
table
,
col1
,
val1
などが変数になる可能性があります。
これの基準は何ですか?どうするんですか?
<サブ ここで似たような質問に対する回答を20分ほど読みましたが、この質問に対する決定的な回答はないようです。
どのように解決するのですか?
バックティックはテーブルとカラムの識別子に使用されますが、識別子が MySQL予約キーワード カラムやテーブルの識別子として予約キーワードを使用することは、 クォートの問題を避けるため、可能な限り避けることが推奨されます。
のような文字列値には一重引用符を使用します。
VALUES()
というリストがあります。 MySQL では文字列値に対してダブルクォートもサポートされていますが、他の RDBMS ではシングルクォートの方が広く受け入れられているので、ダブルクォートではなくシングルクォートを使用するのは良い習慣です。
また、MySQLは
DATE
と
DATETIME
のような文字列としてシングルクォートされるリテラル値。
'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、ドル、アンダースコア)
テーブルやカラムの識別子として、例えば空白を含む、このセット以外の文字を使用することもできますが、その場合は しなければならない を引用(バックティック)してください。
また、数字は識別子として有効な文字ですが、数字だけで識別子を構成することはできません。その場合は、バックティックで囲む必要があります。
関連
-
MySQLデータ型の詳細
-
[解決済み] なぜ SQLAlchemy の count() は生のクエリよりずっと遅いのでしょうか?
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] Bashのシングルクォートとダブルクォートの違い
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] Bashでコマンド内のシングルクォート内の変数を展開する
-
[解決済み】SQLのシングルクォートとダブルクォートの違いは何ですか?
-
[解決済み】MySQLのテーブル、インデックス、データを複製する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL Innodb インデックスメカニズム詳細解説
-
MySQLのWhereの使用方法について説明します。
-
MySQLはこのようなUpdateステートメントを書くべきではありません
-
MySQLの悲観的ロックと楽観的ロックの実装スキーム
-
[解決済み】マルチパート識別子をバインドできない
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。
-
mysql5.7のインストールと、無料・長期利用を目的としたNavicateの導入プロセスについて
-
Mysqlデータベースへのリンク時にpymysqlがConnection refusedエラーを報告する
-
[解決済み] なぜ SQLAlchemy の count() は生のクエリよりずっと遅いのでしょうか?
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?