回答:
バッククォートはテーブルと列の識別子に使用されますが、識別子がMySQLの予約済みキーワードである場合、または識別子に空白文字または制限されたセットを超える文字が含まれている場合にのみ必要です(以下を参照)予約済みキーワードの使用を避けることをお勧めします可能な場合は列またはテーブルの識別子として、引用の問題を回避します。
VALUES()
リストのように文字列値には一重引用符を使用する必要があります。MySQLでは文字列値の二重引用符もサポートされていますが、単一引用符は他のRDBMSで広く受け入れられているため、二重引用符の代わりに単一引用符を使用することをお勧めします。
MySQLはDATE
、DATETIME
リテラル値がのような文字列として単一引用符で囲まれていることも期待しています'2001-01-01 00:00:00'
。相談する日付と時刻リテラルのハイフンを使用して、特定の選択肢で詳細はマニュアルを参照して、-
日付文字列内のセグメントの区切り文字として。
したがって、例を使用すると、PHP文字列を二重引用符で囲み、値に単一引用符を使用します'val1', 'val2'
。 NULL
MySQLキーワードであり、特別な(非)値であるため、引用符で囲まれていません。
これらのテーブルまたは列の識別子は予約語ではなく、引用符を必要とする文字を利用していませんが、とにかくバッククォートで引用しました(これについては後で詳しく説明します)。
RDBMSにネイティブな関数(NOW()
MySQLなど)は引用符で囲まないでください。それらの引数には、すでに説明した同じ文字列または識別子の引用規則が適用されます。
バックティック( `) 表と列───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬ ───────┐ ↓↓↓↓↓↓↓↓↓↓↓↓ $ query = " INSERT INTO` table`( `id`、` col1`、 `col2`、` date`、 `updated`) VALUES(NULL、 'val1'、 'val2'、 '2001-01-01'、NOW()) "; ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 引用符で囲まれていないキーワード─────┴┴┴┘│││││││││││ 単一引用符( ')の文字列───────────┴────┴──┴────┘│││││││ 単一引用符( ')日付───────────────────────────┴──────────┘││││ │ 引用符で囲まれていない関数─────────────────────────────────────────┴┴┴┴┘
変数の引用パターンは変更されませんが、変数を文字列で直接補間する場合は、PHPで二重引用符で囲む必要があります。SQLで使用する変数を適切にエスケープしたことを確認してください。(SQLインジェクションに対する保護として、代わりに準備済みステートメントをサポートするAPIを使用することをお勧めします)。
//いくつかの変数の置換で同じこと //ここでは、変数テーブル名$ tableがバックティック引用され、変数 // VALUESリストでは単一引用符で囲まれています $ query = "INSERT INTO` $ table`( `id`、` col1`、 `col2`、` date`)VALUES(NULL、'$ val1'、'$ val2'、'$ date') ";
準備されたステートメントを使用する場合は、ドキュメントを参照して、ステートメントのプレースホルダーを引用する必要があるかどうかを判断してください。PHP、PDO、およびMySQLiで利用できる最も人気のあるAPI は、他の言語で準備されたほとんどのステートメント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には2種類の引用符があります。
'
文字列リテラルを囲むため`
テーブル名や列名などの識別子を囲むためそして"
、特別なケースがあります。MySQLサーバーに応じて、一度に上記の目的のいずれかに使用できますsql_mode
。
"
ように文字を使用して文字列リテラルを囲むことができます。'
ANSI_QUOTES
モード"
文字が同じように、識別子を囲むために使用することができます`
SELECT "column" FROM table WHERE foo = "bar"
クエリは、列が文字"column"
列foo
と等しい文字列リテラルを選択します"bar"
クエリは、列column
が列foo
と等しい列を選択しますbar
"
コードがSQLモードから独立するように、使用を避けることをお勧めします(質問のSQLの性質に関して上記の良い答えがありますが、これはPHPを初めて使用する場合にも関連する可能性があります。)
おそらく、PHPが単一引用符と二重引用符で囲まれた文字列を別々に処理することを言及することが重要です...
一重引用符で囲まれた文字列は「リテラル」であり、ほとんどWYSIWYG文字列です。二重引用符で囲まれた文字列は、可能な変数置換のためにPHPによって解釈されます(PHPのバッククォートは正確には文字列ではなく、シェルでコマンドを実行して結果を返します)。
例:
$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list
バッククォートは、一般的に示すために使用されているidentifier
と同様になり、安全誤って使用してからの予約済みキーワード。
例えば:
Use `database`;
ここで、バックティックは、サーバーdatabase
が実際にはデータベースの識別子ではなくデータベースの名前であることをサーバーが理解するのに役立ちます。
テーブル名とフィールド名についても同じことができます。データベース識別子をバッククォートで囲む場合、これは非常に良い習慣です。
次に、二重引用符と単一引用符についてです(Michaelはすでにそれについて言及しています)。
ただし、値を定義するには、一重引用符または二重引用符を使用する必要があります。別の例を見てみましょう。
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);
ここでは、意図的にtitle1
を引用符で囲むことを忘れています。これで、サーバーはをtitle1
列名(つまり、識別子)として受け取ります。したがって、それが値であることを示すには、二重引用符または一重引用符を使用する必要があります。
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');
現在、PHPと組み合わせて、二重引用符と単一引用符を使用すると、クエリの記述時間がはるかに簡単になります。質問のクエリの修正版を見てみましょう。
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
さて、PHPで二重引用符を使用して、変数を行います$val1
と、$val2
これは完全に有効なクエリを作成、それらの値を使用します。お気に入り
$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
作る予定です
INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')
MySQLでは、これらのシンボルは、クエリを区切るために使用されている`
、"
、'
と()
。
"
または'
紐状の値を囲むために使用されている"26-01-2014 00:00:00"
かを'26-01-2014 00:00:00'
。これらのシンボルは文字列だけのためのものである、などの機能を集約していないnow
、sum
またはmax
。
`
テーブルや列の名前を囲むために使用されます。例: select `column_name` from `table_name` where id='2'
(
そして)
単にクエリの一部を囲みます select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
。
MySQLとPHPの文字列リテラルは同じです。
文字列はバイトまたは文字のシーケンスであり、単一引用符( "'")または二重引用符( "" ")の文字で囲まれます。
したがって、文字列に一重引用符が含まれている場合は、二重引用符を使用して文字列を引用できます。二重引用符が含まれている場合は、一重引用符を使用して文字列を引用できます。ただし、文字列に一重引用符と二重引用符の両方が含まれている場合は、文字列を引用するために使用した引用符をエスケープする必要があります。
ほとんどの場合、SQL文字列値には一重引用符を使用するため、PHP文字列には二重引用符を使用する必要があります。
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";
また、PHPの二重引用符で囲まれた文字列で変数を使用できます。
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";
しかし、$val1
または$val2
単一引用符が含まれていると、SQLが正しくなくなります。したがって、SQLで使用する前にエスケープする必要があります。それがmysql_real_escape_string
目的です。(ただし、準備されたステートメントの方が優れています。)
PHPとMySQLの組み合わせでは、二重引用符と一重引用符を使用すると、クエリを書く時間が非常に簡単になります。
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
ここで、MySQLクエリに直接ポスト変数を使用していると仮定し、次のように使用します。
$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";
これは、PHP変数をMySQLに使用するためのベストプラクティスです。
ここには多くの役立つ答えがあり、一般に2つのポイントに達します。
そして@MichaelBerkowskiが言ったように
バッククォートはテーブルと列の識別子に使用されますが、識別子が
MySQL
予約済みのキーワードである場合、または識別子に空白文字または制限されたセットを超える文字が含まれている場合にのみ必要です(以下を参照)。可能な場合は列またはテーブルの識別子。引用の問題を回避します。
ただし、識別子が予約済みキーワードにならない場合や、制限されたセットを超えて空白や文字を含めることができない場合もありますが、それらの周囲には必ずバッククォートが必要です。
例
123E10
有効な識別子名ですが、有効なINTEGER
リテラルでもあります。
[このような識別子名の取得方法については詳しく説明しません]という名前の一時テーブルを作成するとし123456e6
ます。
バックティックにエラーはありません。
DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)
バックティックを使用していないときのエラー。
DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1
ただし、123451a6
完全に細かい識別子名です(バックティックなし)。
DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)
これも完全に1234156e6
指数です。
テーブルの列と値が変数の場合、2つの方法があります。
二重引用符""
で完全なクエリ:
$query = "INSERT INTO $table_name (id, $col1, $col2)
VALUES (NULL, '$val1', '$val2')";
または
$query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
VALUES (NULL, '".$val1."', '".$val2."')";
一重引用符付き''
:
$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
VALUES (NULL, '.$val1.', '.$val2.')';
``
列/値の名前がMySQLの予約済みキーワードに似ている場合は、バックティックを使用します。
注:列名をテーブル名で表す場合は、次のようにバックティックを使用します。
`table_name`
。`column_name`
<-注:.
バックティックから除外します。
(十分に説明された)すべての回答に加えて、次のような言及はありませんでした。私はこのQ&Aに頻繁にアクセスしています。
手短に; MySQLは、独自のテーブル/列で数学を実行したいと考え、「電子メール」などのハイフンをe
マイナス と解釈しmail
ます。
免責事項:データベースの操作にまったく慣れておらず、すでに説明されている技術用語を理解していない可能性がある場合は、「FYI」タイプの回答としてこれを追加すると思いました。
SQLサーバーおよびMySQL、PostgreySQL、Oracleは二重引用符( ")を認識しません。したがって、クエリには二重引用符(")を含めず、単一引用符( ')のみを使用する必要があります。
Back-trip( `)はSQLでの使用がオプションであり、テーブル名、DB名、および列名に使用されます。
MySQLを呼び出すためにバックエンドでクエリを記述しようとしている場合は、二重引用符( ")または単一引用符( ')を使用して、次のような変数にクエリを割り当てることができます。
let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';
それらがwhere
クエリ内のステートメントであるinsert
か、update
文字列である値または値、あるいはその両方を試行している場合は、次のようにこれらの値に単一引用符( ')を使用します。
let querySelect = "select id, name from accounts where name = 'John'";
let queryUpdate = "update accounts set name = 'John' where id = 8";
let queryInsert = "insert into accounts(name) values('John')";
//Please not that double quotes are only to be used in assigning string to our variable not in the query
//All these below will generate error
let querySelect = 'select id, name from accounts where name = "John"';
let queryUpdate = 'update accounts set name = "John" where id = 8';
let queryInsert = 'insert into accounts(name) values("John")';
//As MySQL or any SQL doesn't understand double quotes("), these all will generate error.
二重引用符( ")と単一引用符( ')を使用するときにこの混乱を避けたい場合は、単一引用符(')を使用することをお勧めします。これには次のようなバックスラッシュ()が含まれます。
let query = 'select is, name from accounts where name = \'John\'';
double( ")またはsingle( ')の引用の問題は、動的な値を割り当て、次のような文字列連結を実行する必要がある場合に発生します。
let query = "select id, name from accounts where name = " + fName + " " + lName;
//This will generate error as it must be like name = 'John Smith' for SQL
//However our statement made it like name = John Smith
//In order to resolve such errors use
let query = "select id, name from accounts where name = '" + fName + " " + lName + "'";
//Or using backslash(\)
let query = 'select id, name from accounts where name = \'' + fName + ' ' + lName + '\'';
さらにクリアランスが必要な場合は、JavaScriptの引用符に従ってください
"tablename"
、二重引用符は区切られた識別子用で、一重引用符はリテラル用です(たとえば)'this is a some text'
。バックティックは、標準SQLでは使用されません。(識別子に二重引用符を含める必要がある場合は、二重引用符をとして入力し"odd""tablename"
ます。同様に、リテラルのように二重単一引用符を使用します'Conan O''Brien'
。)