Когда использовать одинарные кавычки, двойные кавычки и обратные Тики в MySQL

Я пытаюсь узнать лучший способ писать запросы. Я также понимаю важность последовательности. До сих пор я случайно использовал одинарные кавычки, двойные кавычки и обратные тики без каких-либо реальных мыслей.

пример:

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

кроме того, в приведенном выше примере, считаю, что "table," "col[n]," and "val[n]" может быть переменным.

каков стандарт для этого? Чем вы занимаетесь?

Я читал ответы на подобные вопросы там 20 минут, но, похоже, нет окончательного ответа на этот вопрос.

12 ответов


Backticks должны использоваться для идентификаторов таблиц и столбцов, но необходимы только тогда, когда идентификатор зарезервированное ключевое слово MySQL, или когда идентификатор содержит пробелы или символы за пределами ограниченного набора (см. ниже) Часто рекомендуется избегать использования зарезервированных ключевых слов в качестве идентификаторов столбцов или таблиц, когда это возможно, избегая проблемы цитирования.

одинарные кавычки должны использоваться для строковых значений, таких как VALUES() список. Двойной котировки также поддерживаются MySQL для строковых значений, но одинарные кавычки более широко принимаются другими СУБД, поэтому хорошая привычка использовать одинарные кавычки вместо двойных.

MySQL также ожидает DATE и DATETIME литеральные значения для одинарных кавычек в виде строк, таких как '2001-01-01 00:00:00'. Проконсультируйтесь литералы даты и времени документация для более подробной информации, в частности Альтернативы с помощью дефиса - как разделитель сегментов по дате веревка.

поэтому, используя Ваш пример, я бы дважды процитировал строку PHP и использовал одинарные кавычки на значениях 'val1', 'val2'. NULL является ключевым словом MySQL и специальным (не)-значением и поэтому не кавычки.

ни один из этих идентификаторов таблиц или столбцов не является зарезервированными словами или не использует символы, требующие цитирования, но я все равно процитировал их с помощью backticks (подробнее об этом позже...).

функции, родные для СУБД (например,NOW() в MySQL) не следует цитировать, хотя их аргументы подчиняются тем же правилам цитирования строк или идентификаторов, которые уже упоминались.

Backtick (`)
table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐
                      ↓     ↓  ↓  ↓  ↓    ↓  ↓    ↓  ↓    ↓  ↓       ↓
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) 
                       VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())";
                               ↑↑↑↑  ↑    ↑  ↑    ↑  ↑          ↑  ↑↑↑↑↑ 
Unquoted keyword          ─────┴┴┴┘  │    │  │    │  │          │  │││││
Single-quoted (') strings ───────────┴────┴──┴────┘  │          │  │││││
Single-quoted (') DATE    ───────────────────────────┴──────────┘  │││││
Unquoted function         ─────────────────────────────────────────┴┴┴┴┘    

переменной интерполяции

шаблоны цитирования для переменных не изменяются, хотя если вы собираетесь интерполировать переменные непосредственно в строке, она должна быть двойной кавычки в PHP. Просто убедитесь, что вы правильно избежали переменных для использования в SQL. (рекомендуется использовать API, поддерживающий подготовленный операторы вместо этого, как защита от SQL-инъекции).

// Same thing with some variable replacements
// Here, a variable table name $table is backtick-quoted, and variables
// in the VALUES list are single-quoted 
$query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";

подготовленные заявления

при работе с подготовленными инструкциями обратитесь к документации, чтобы определить, должны ли быть указаны заполнители инструкции. Самые популярные API, доступные в PHP, 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 (?, ?, ?, ?)";

символы requring backtick цитирование в идентификаторах:

согласно документации MySQL, вам не нужно цитировать (backtick) идентификаторы, используя следующий набор символов:

ASCII:[0-9,a-z,A-Z$_] (основные латинские буквы, цифры 0-9, доллар, подчеркивание)

вы можете использовать символы за пределами этого набора в качестве идентификаторов таблицы или столбца, включая пробелы, например, но тогда вы должны цитата (backtick) их.


в MySQL есть два типа кавычек:

  1. ' для включения строковых литералов
  2. ` для включения идентификаторов, таких как имена таблиц и столбцов

и тогда уже " что является частным случаем. Его можно использовать для один вышеупомянутых целей в то время, в зависимости от сервера MySQL sql_mode:

  1. по умолчанию the " символ может использоваться для включения строковых литералов, таких как '
  2. на ANSI_QUOTES режим " символ может использоваться для включения идентификаторов так же, как `

следующий запрос приведет к различным результатам (или ошибкам) в зависимости от режима SQL:

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES инвалидов

запрос выберет строковый литерал "column" где колонки foo равно string "bar"

ANSI_QUOTES включена

запрос выберет столбец column где колонки foo равна графе bar

когда использовать

  • я предлагаю вам не использовать " чтобы ваш код стал независимым от режимов SQL
  • всегда указывайте идентификаторы, так как это хорошая практика (довольно много вопросов о том, чтобы обсудить это)

(есть хорошие ответы выше относительно характера SQL вашего вопроса, но это также может быть актуально, если вы новичок в PHP.)

возможно, важно отметить, что PHP обрабатывает одинарные и двойные кавычки строк по-разному...

одинарные кавычки строки 'литералы' и довольно много предпросмотром строк. Строки с двойными кавычками интерпретируются PHP для возможной подстановки переменных (backticks в 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

Backticks обычно используются для обозначения identifier, а также безопасное от случайного использования Зарезервированные Слова.

например:

Use `database`;

здесь backticks поможет серверу понять, что database на самом деле имя базы данных, а не идентификатор базы данных.

то же самое можно сделать для имен таблиц и имен полей. Это очень хорошая привычка если вы обернуть идентификатор базы данных с одиночными кавычками.

Регистрация этой ответ, чтобы понять больше о backticks.


теперь о двойных кавычках и одинарных кавычках (Майкл уже упоминал об этом).

но для определения значения необходимо использовать одинарные или двойные кавычки. Рассмотрим другой пример.

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, есть такие типы идентификаторов, которые используются в query ` ," ,' и () .

  1. " или ' используйте для заключать строку как значения "26-01-2014 00:00:00" или '26-01-2014 00:00:00' . Этот идентификатор используется только для строки, а не для агрегатной функции, такой как now() or sum ,max etc.

  2. ` используйте для включения таблицы или столбца таблицы, например, выберите column_name С table_name где id= '2'

  3. () используются только для включения частей запроса, например select column_name С table_name где а (id='2' и пол= "мужской") или name='Роман' .


строковые литералы в 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')";

теперь предположим, что вы используете переменную direct post в запросе MySQL, используйте ее таким образом:

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

Это лучшая практика для использования переменных PHP в MySQL.


если таблица cols и значения являются переменными, то есть два способа:

в двойные кавычки "" полный запрос:

$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` . от клещей.


здесь было много полезных ответов, обычно заканчивающихся двумя моментами.

  1. BACKTICKS (`) используются вокруг имен идентификаторов.
  2. одинарные кавычки (') используются вокруг значений.

и как сказал @MichaelBerkowski

Backticks должны использоваться для идентификаторов таблиц и столбцов, но необходимо только в том случае, если идентификатор MySQL зарезервированное ключевое слово, или если идентификатор содержит пробелы символы или символы помимо ограниченного набора (см. ниже) Часто рекомендуется избегать использование зарезервированных ключевых слов в качестве идентификаторов столбцов или таблиц, когда это возможно, избегая проблемы цитирования.

существует случай, когда идентификатор не может быть ни зарезервированное ключевое слово или содержать пробел или символы за пределами ограниченного набора но обязательно требуют backticks вокруг их.

пример

123E10 является допустимым именем идентификатора, но также и допустимым INTEGER литерал.

[не вдаваясь в подробности, как вы получите такое имя идентификатора], предположим, я хочу создать временную таблицу с именем 123456e6.

отсутствие ошибки на backticks.

DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

ошибка при Не использовании backticks.

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 также является экспоненциальным числом.


одинарные кавычки должны использоваться для строковых значений, как в списке VALUES ().

Backticks обычно используются для указания идентификатора, а также быть в безопасности от случайного использования зарезервированных ключевых слов.

в сочетании PHP и MySQL двойные кавычки и одинарные кавычки делают ваше время написания запроса намного проще.


помимо всех (хорошо объясненных) ответов, не было упомянуто следующее, и я посещаю этот вопрос и ответ довольно часто.

в двух словах; MySQL думает, что вы хотите сделать математику на своей собственной таблице / столбце и интерпретирует дефисы, такие как" электронная почта", как e минус mail.


отказ от ответственности: поэтому я подумал, что добавлю это как тип ответа" FYI " для тех, кто совершенно новичок в работе с базами данных и которые могут не понимать уже описанные технические термины.


серверы SQL и MySQL, PostgreySQL, Oracle не понимают двойные кавычки ("). Таким образом, ваш запрос должен быть свободен от двойных кавычек(") и должны использовать одинарные кавычки(').

Back-trip (`) не является обязательным для использования в SQL и используется для имени таблицы, имени БД и имен столбцов.

если вы пытаетесь написать запрос в своем бэк-энде для вызова 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\'';

проблема с двойными ( " ) или одиночными (') кавычками возникает, когда нам нужно было назначить некоторое динамическое значение и выполнить некоторую строку конкатенация типа:

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