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

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

Пример:

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

Также в приведенном выше примере учтите, что table, col1, val1 и т.д. могут быть переменными.

Каков стандарт для этого? Как вы поступаете?

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

Комментарии к вопросу (1)
Решение

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

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

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

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

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

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

Обратный знак (`)
table & column ───────┬┬┬────────────────────────────────┬───────────┬───────────┬───────┬──────────────┐
                      ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$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')";

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

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

Символы, требующие обратного тика в идентификаторах:

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

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

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

Комментарии (11)

Существует два типа кавычек в MySQL:

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

И потом есть в ", который представляет собой особый случай. Он может быть использован для one вышеперечисленных целей в момент, в зависимости от сервера MySQL'ы sql_mode:

  1. Выше контроллеры _By на в " Символ может быть использован для заключайте строковые литералы как '
  2. В ANSI_QUOTES режиме в " Символ может быть использован, чтобы заключать идентификаторы прям как в <код> в`</код>

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

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

ANSI_QUOTES отключены

Запрос будет выбирать строковый литерал в "; баре&quot колонка" в которых столбец Foo - это равные строки в "

ANSI_QUOTES включено

Запрос будет выбирать столбец, колонка, где столбецFoo- это равный столбцубар`

Когда следует использовать то, что

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

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

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

Одинарные кавычки строки 'литералы' и в значительной степени визуальный строк. Двойные кавычки интерпретируются по 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
Комментарии (0)

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

Например:

Use `database`;

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

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

Посмотрите ответ this, чтобы понять больше о обратных знаках.


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

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

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')
Комментарии (0)

В MySQL, эти символы используются для определения запроса``, в",'и()` .

  1. в " и &#39; используются для ограждения строковые значения в"26-01-2014 00:00:00"В или'26-01-2014 00:00:00'. Эти символы предназначены только для строк, а не агрегатные функции, такие кактеперь,сумма, илиMax`.

  2. ` используется для заключать имена таблиц или столбцов, например, выберите `имя_столбца` от `имя_таблицы` где id=&#39;2&#39;

  3. ( и ) просто заключите части запроса, например, выберите `имя_столбца` от `имя_таблицы`, где (идентификатор=&#39;2&#39; и пол=&#39;мужчина&#39;) или name=&#39;Ракеш&#39; .

Комментарии (0)

Строковые литералы в MySQL и PHP такие же.

строка-это последовательность байтов или символов, заключенная в одинарная кавычка (“'”) или двойная кавычка (“, что"”) символов.

Так что если ваша строка содержит одинарные кавычки, то вы можете использовать двойные кавычки, чтобы процитировать строки, или если он содержит двойные кавычки, то вы можете использовать одинарные кавычки, чтобы заключить строку в кавычки. Но если ваша строка содержит одинарные кавычки и двойные кавычки, вы должны защитить тот что б процитировать строки.

В основном, мы используем одиночные кавычки для строковых значений в SQL, так что мы должны использовать двойные кавычки для строки PHP.

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

И вы могли бы использовать переменную в PHP's двойной кавычки:

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

Но если $val1 или $val2 содержит одинарные кавычки, которые сделают ваш SQL будет неправильно. Так что вам нужно, чтобы защитить его, прежде чем он используется в SQL; это то, что использования mysql_real_escape_string для. (Хотя подготовленном заявлении лучше.)

Комментарии (0)

В сочетание 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.

Комментарии (4)

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

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

И как @MichaelBerkowski сказал

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

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

Пример

123E10 - это допустимое имя идентификатора, но и действительное целое число литерал.

[Не вдаваясь в детали, как бы вы получить такой идентификатор], предположим, я хочу создать временную таблицу с именем 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 также экспоненциального числа.

Комментарии (0)

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

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

$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.

Примечание: Если вы обозначаете имя столбца именем таблицы, то используйте обратные тики следующим образом:

имя_таблицы``.имя_столбца`` ``

Комментарии (0)

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

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

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

Комментарии (0)

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

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


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

Комментарии (0)

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

Туда-обратно(`) является обязательным для использования в SQL и используется имя таблицы, имя базы данных и имена столбцов.

Если вы пытаетесь написать запрос в спине-конец вызова MySQL, то можно использовать двойные кавычки(" У) или одинарные кавычки(') для назначения запроса переменной, как:

let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';

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

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

Комментарии (0)