Когда использовать одинарные, двойные и обратные тики в MySQL
Я пытаюсь узнать лучший способ написания запросов. Я также понимаю важность того, чтобы быть последовательным. До сих пор я беспорядочно использовал одинарные, двойные и обратные тики без каких-либо реальных мыслей.
Пример:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Также в приведенном выше примере учтите, что "table," "col[n]," and "val[n]"
могут быть переменными.
Какой стандарт для этого? Чем ты занимаешься?
Я читал ответы на подобные вопросы здесь около 20 минут, но, похоже, нет однозначного ответа на этот вопрос.
14 ответов
Обратные метки должны использоваться для идентификаторов таблиц и столбцов, но они необходимы только в том случае, если идентификатор является зарезервированным ключевым словом 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 ()) "; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Ключевое слово без кавычек ─────┴┴┴┘ │ │ │ │ │ │ │││││ Строки в одинарных кавычках (') ───────────┴────┴──┴────┘ │ │ │││││ Одиночная кавычка (') ДАТА ──────────────────────────┴──────────┘ │││││ Функция без кавычек ──────────────────────────────────────────────┴┴┴┴┘
Переменная интерполяция
Шаблоны кавычек для переменных не меняются, хотя, если вы намереваетесь интерполировать переменные непосредственно в строке, в PHP это должно быть заключено в двойные кавычки. Просто убедитесь, что вы правильно экранировали переменные для использования в SQL. ( Вместо этого рекомендуется использовать API, поддерживающий подготовленные операторы, в качестве защиты от внедрения SQL).
// То же самое с некоторыми заменами переменных // Здесь имя переменной таблицы $table заключено в кавычки, а переменные // в списке ЗНАЧЕНИЙ одинарные кавычки $ 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, вам не нужно заключать в кавычки (backtick) идентификаторы, используя следующий набор символов:
ASCII:
[0-9,a-z,A-Z$_]
(основные латинские буквы, цифры 0-9, доллар, подчеркивание)
Вы можете использовать символы вне этого набора в качестве идентификаторов таблицы или столбца, включая, например, пробелы, но затем вы должны заключить их в кавычки (с обратной косой чертой).
В MySQL есть два типа кавычек:
'
для включения строковых литералов`
для включения идентификаторов, таких как имена таблиц и столбцов
И тогда есть "
который является частным случаем. Это может быть использовано для одной из вышеупомянутых целей одновременно в зависимости от сервера MySQL sql_mode
:
- По умолчанию
"
символ может быть использован для включения строковых литералов так же, как'
- В
ANSI_QUOTES
мод"
символ может быть использован для включения идентификаторов так же, как`
Следующий запрос выдаст разные результаты (или ошибки) в зависимости от режима SQL:
SELECT "column" FROM table WHERE foo = "bar"
ANSI_QUOTES отключен
Запрос выберет строковый литерал "column"
где столбец foo
равно строке "bar"
ANSI_QUOTES включен
Запрос выберет столбец column
где столбец foo
равно столбцу bar
Когда что использовать
- Я предлагаю вам избегать использования
"
так что ваш код становится независимым от режимов SQL - Всегда заключайте в кавычки идентификаторы, так как это хорошая практика (довольно много вопросов по SO обсуждают это)
(Есть хорошие ответы выше относительно природы вашего вопроса в 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
на самом деле это имя базы данных, а не идентификатор базы данных.
То же самое можно сделать для имен таблиц и имен полей. Это очень хорошая привычка, если вы добавляете в свой идентификатор базы данных кавычки.
Проверьте этот ответ, чтобы понять больше о кавычках.
Теперь о двойных кавычках и одинарных кавычках (Майкл уже упоминал об этом).
Но, чтобы определить значение, вы должны использовать одинарные или двойные кавычки. Давайте посмотрим на другой пример.
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() or sum ,max
и т.п.`
использовать для включения таблицы или столбца таблицы, например, выберитеcolumn_name
отtable_name
где id='2'()
используются только для включения частей запроса, например, выберитеcolumn_name
отtable_name
где (id='2' и пол ='male') или name='rakesh' .
Здесь было много полезных ответов, как правило, завершающихся двумя пунктами.
- BACKTICKS (`) используются вокруг имен идентификаторов.
- ЕДИНЫЕ ЦИТАТЫ (') используются вокруг значений.
И как сказал @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
также экспоненциальное число.
Строковые литералы в 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')";
Теперь, предположим, что вы используете прямую переменную post в запросе MySQL, используйте ее следующим образом:
$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";
Это лучшая практика для использования переменных PHP в MySQL.
Если столбцы таблицы и значения являются переменными, то есть два пути:
С двойными кавычками ""
полный запрос:
$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`
<- Примечание: исключить .
от спины клещей.
Одиночные кавычки должны использоваться для строковых значений, как в списке VALUES().
Обратные пометки обычно используются для указания идентификатора, а также для предотвращения случайного использования зарезервированных ключевых слов.
В сочетании с 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
Иногда полезно не использовать кавычки... потому что это может выявить проблемы в коде, генерирующем запрос... Например:
Где x и y всегда должны быть целыми числами...
ВЫБЕРИТЕ ИЗ
table
ГДЕ x= И y=0
Ошибка синтаксиса SQL... немного лениво, но может быть полезно...
Простыми словами:
Кавычки (одинарные и двойные) используются вокруг строк.
Обратные кавычки используются вокруг идентификаторов таблиц и столбцов.
Совместное достижение одинарных и двойных кавычек:
~ Если мы хотим этого добиться,
Попробуй это,
Полное объяснение: