it-roy-ru.com

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

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

Пример:

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

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

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

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

546
Nate

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

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

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

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

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

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

Backtick (`) 
 Таблица и столбец ───────┬─────┬──┬──┬──┬──────────────────┬──┬─ ───┬──┬───────┐ 
 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 
 $ Query = "INSERT INTO `table` (` id`, `col1`,` col2`, `date`,` updated`) 
 VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW ())"; 
 ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 
 Ключевое слово без кавычек ─────┴┴┴┘ │ │ │ │ │ │ │││││ 
 Single- кавычки (') строки ───────────┴────┴──┴────┘ │ │ │││││ 
 Одиночные кавычки (') ДАТА ─── ────────────────────────┴──────────┘─ 
 Функция без кавычек ──── ───────────────────────────────────── 

Переменная интерполяция

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

// То же самое с некоторыми заменами переменных 
// Здесь имя таблицы переменных $ table заключено в кавычки, а переменные __.// в списке VALUES заключены в одинарные кавычки 
 $ Query = "INSERT INTO `$ Table`  (`id`,` col1`, `col2`,` date`) VALUES (NULL, «$ Знач1»'$ Val2'«Дата $») "; 

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

При работе с подготовленными утверждениями сверьтесь с документацией, чтобы определить, нужно ли указывать заполнители утверждения. Самые популярные API, доступные в PHP, PDO и MySQLi, ожидают unquoted заполнители, как и большинство подготовленных 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 , вам не нужно заключать в кавычки (backtick) идентификаторы, используя следующий набор символов:

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

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

536
Michael Berkowski

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

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

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

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

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

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

ANSI_QUOTES отключен

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

ANSI_QUOTES включен

Запрос выберет столбец column, где столбец foo равен столбцу bar

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

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

(Есть хорошие ответы выше относительно 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
29
Chris Trahey

Обратные пометки обычно используются для обозначения identifier, а также для того, чтобы safe случайно использовать Reserved Keywords

Например:

Use `database`;

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

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

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


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

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

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')
19
Starx

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

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

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

  3. ( и ) просто заключают части запроса, например select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'.

12
Kumar 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. (Хотя подготовленное заявление лучше.)

11
xdazz

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

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

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

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

Это лучший способ использовать переменные PHP в MySQL.

10
vipul sorathiya

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

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

$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` <- Примечание: исключить . из обратных тиков.

9
diEcho

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

  1. BACKTICKS (`) используются вокруг имен идентификаторов.
  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 также является экспоненциальным числом.

9
user5574289

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

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

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

7
john igneel

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

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


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

2
Funk Forty Niner

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

0
NAVIN