Я пытаюсь узнать лучший способ написания запросов. Я также понимаю важность того, чтобы быть последовательным. До сих пор я беспорядочно использовал одинарные, двойные и обратные кавычки без какой-либо реальной мысли.
Пример:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Кроме того , в приведенном выше примере, считают , что table
, col1
, val1
и т.д. , могут быть переменными.
Какой стандарт для этого? Чем ты занимаешься?
Я читал ответы на подобные вопросы здесь около 20 минут, но, похоже, нет однозначного ответа на этот вопрос.
"tablename"
, и одинарные кавычки для литералов, например'this is a some text'
. Обратные галочки никогда не используются в стандартном SQL. (Если вам нужно включить двойную кавычку в идентификатор, введите его дважды, как"odd""tablename"
. Аналогично, двойные одинарные кавычки в литералах, например'Conan O''Brien'
.)Ответы:
Обратные метки должны использоваться для идентификаторов таблицы и столбца, но они необходимы только в том случае, если идентификатор является зарезервированным ключевым словом MySQL или когда идентификатор содержит пробельные символы или символы за пределами ограниченного набора (см. Ниже). Часто рекомендуется избегать использования зарезервированных ключевых слов. в качестве идентификаторов столбцов или таблиц, когда это возможно, избегая проблемы цитирования.
Одиночные кавычки должны использоваться для строковых значений, как в
VALUES()
списке. Двойные кавычки также поддерживаются MySQL для строковых значений, но одинарные кавычки более широко принимаются другими СУБД, поэтому рекомендуется использовать одинарные кавычки вместо двойных.MySQL также ожидает
DATE
иDATETIME
буквальные значения , чтобы быть в одинарных кавычках как строки , как'2001-01-01 00:00:00'
. Обратитесь к документации по-
датам даты и времени для получения более подробной информации, в частности, об альтернативах использованию дефиса в качестве разделителя сегмента в строках даты.Поэтому, используя ваш пример, я бы заключил в кавычки строку PHP и использовал одинарные кавычки в значениях
'val1', 'val2'
.NULL
является ключевым словом MySQL и имеет специальное (не) -значение, и поэтому не заключено в кавычки.Ни один из этих идентификаторов таблицы или столбца не является зарезервированными словами и не использует символы, требующие кавычек, но я все равно цитировал их с помощью обратных галочек (подробнее об этом позже ...).
Функции, родные для СУБД (например,
NOW()
в MySQL), не должны заключаться в кавычки, хотя их аргументы подчиняются той же самой строке или правилам цитирования идентификаторов, которые уже упоминались.Переменная интерполяция
Шаблоны кавычек для переменных не меняются, хотя, если вы намереваетесь интерполировать переменные непосредственно в строке, они должны быть заключены в двойные кавычки в PHP. Просто убедитесь, что вы правильно экранировали переменные для использования в SQL. ( Вместо этого рекомендуется использовать API, поддерживающий подготовленные операторы, в качестве защиты от внедрения SQL ).
Подготовленные заявления
При работе с подготовленными утверждениями сверьтесь с документацией, чтобы определить, нужно ли указывать заполнители утверждения. Самые популярные API-интерфейсы, доступные в PHP, PDO и MySQLi, ожидают заполнителей без кавычек , как и большинство подготовленных API-операторов операторов на других языках:
Символы, требующие использования кавычек в идентификаторах:
Согласно документации MySQL , вам не нужно заключать в кавычки (backtick) идентификаторы, используя следующий набор символов:
Вы можете использовать символы вне этого набора в качестве идентификаторов таблицы или столбца, в том числе, например, пробелов, но затем вы должны заключить их в кавычки (обратные кавычки).
источник
В MySQL есть два типа кавычек:
'
для включения строковых литералов`
для включения идентификаторов, таких как имена таблиц и столбцовИ тут есть
"
особый случай. Это может использоваться для одной из вышеупомянутых целей одновременно в зависимости от сервера MySQLsql_mode
:"
символ может быть использован , чтобы приложить строковые литералы так же , как'
ANSI_QUOTES
режиме"
символ может быть использован для включения идентификаторов так же, как`
Следующий запрос выдаст разные результаты (или ошибки) в зависимости от режима SQL:
ANSI_QUOTES отключен
Запрос выберет строковый литерал,
"column"
где столбецfoo
равен строке"bar"
ANSI_QUOTES включен
Запрос выберет столбец,
column
где столбецfoo
равен столбцуbar
Когда использовать что
"
чтобы ваш код стал независимым от режимов SQLисточник
(Выше приведены хорошие ответы относительно природы вашего вопроса в SQL, но это также может быть актуально, если вы новичок в PHP.)
Возможно, важно отметить, что PHP обрабатывает одинарные и двойные кавычки по-разному ...
Строки в одинарных кавычках являются «литералами» и в значительной степени являются строками WYSIWYG. Строки в двойных кавычках интерпретируются PHP для возможной подстановки переменных (обратные пометки в PHP не совсем строки; они выполняют команду в оболочке и возвращают результат).
Примеры:
источник
Обратные кавычки , как правило , используются для обозначения
identifier
и также быть безопасными от случайного использования зарезервированных ключевых слов .Например:
Здесь обратные пометки помогут серверу понять, что на
database
самом деле это имя базы данных, а не ее идентификатор.То же самое можно сделать для имен таблиц и имен полей. Это очень хорошая привычка, если вы добавляете в свой идентификатор базы данных кавычки.
Теперь о двойных кавычках и одинарных кавычках (Майкл уже упоминал об этом).
Но, чтобы определить значение, вы должны использовать одинарные или двойные кавычки. Давайте посмотрим на другой пример.
Здесь я намеренно забыл завернуть в
title1
кавычки. Теперь сервер приметtitle1
имя столбца (т. Е. Идентификатор). Таким образом, чтобы указать, что это значение, вы должны использовать либо двойные, либо одинарные кавычки.Теперь, в сочетании с PHP, двойные кавычки и одинарные кавычки значительно упрощают процесс написания запросов. Давайте посмотрим модифицированную версию запроса в вашем вопросе.
Теперь, используя двойные кавычки в PHP, вы будете создавать переменные
$val1
и$val2
использовать их значения, создавая тем самым совершенно правильный запрос. подобносделаю
источник
В 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.
И вы можете использовать переменную в строке двойных кавычек PHP:
Но если
$val1
или$val2
содержит одинарные кавычки, это сделает ваш SQL ошибочным. Так что вам нужно избежать его, прежде чем он будет использован в SQL; вотmysql_real_escape_string
для чего. (Хотя подготовленное утверждение лучше.)источник
В сочетании с PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают процесс написания запросов.
Теперь, предположим, что вы используете прямую переменную post в запросе MySQL, используйте ее следующим образом:
Это лучший способ использования PHP-переменных в MySQL.
источник
Здесь было много полезных ответов, как правило, завершающихся двумя пунктами.
И как сказал @MichaelBerkowski
Однако существует случай, когда идентификатор не может быть зарезервированным ключевым словом или содержать пробелы или символы за пределами ограниченного набора, но обязательно должен содержать обратные пометки вокруг них.
ПРИМЕР
123E10
является допустимым именем идентификатора, но также действительнымINTEGER
литералом.[Не вдаваясь в подробности, как вы могли бы получить такое имя идентификатора], предположим, я хочу создать временную таблицу с именем
123456e6
.Нет ошибок на спинах.
ОШИБКА, когда не используется обратная пометка.
Тем не менее,
123451a6
это идеально точное имя идентификатора (без обратной галочки).Это полностью потому, что
1234156e6
это также экспоненциальное число.источник
Если столбцы таблицы и значения являются переменными, то есть два пути:
С двойными кавычками
""
полный запрос:Или
С одинарными кавычками
''
:Используйте обратные галочки,
``
когда имя столбца / значения похоже на зарезервированное ключевое слово MySQL.Примечание. Если вы указываете имя столбца с именем таблицы, используйте обратные галочки, например:
`table_name`
,`column_name`
<- Примечание: исключить.
из обратных тиков.источник
Одиночные кавычки должны использоваться для строковых значений, как в списке VALUES ().
Обратные пометки обычно используются для обозначения идентификатора, а также для предотвращения случайного использования зарезервированных ключевых слов.
В сочетании с PHP и MySQL двойные кавычки и одинарные кавычки значительно ускоряют процесс написания запроса.
источник
Помимо всех (хорошо объясненных) ответов, не было упомянуто следующего, и я часто посещаю эти вопросы и ответы.
В двух словах; MySQL думает, что вы хотите заняться математикой для своей таблицы / столбца, и интерпретирует такие дефисы, как «электронная почта», как
e
минусmail
.Отказ от ответственности: поэтому я подумал, что добавлю это как ответ типа «FYI» для тех, кто совершенно новичок в работе с базами данных и может не понимать уже описанные технические термины.
источник
SQL-серверы и MySQL, PostgreySQL, Oracle не понимают двойные кавычки ("). Таким образом, ваш запрос не должен содержать двойных кавычек (") и должен использовать только одинарные кавычки (').
Back-trip (`) необязательно использовать в SQL и используется для имени таблицы, имени БД и имени столбца.
Если вы пытаетесь написать запрос в своем бэкэнде для вызова MySQL, то вы можете использовать двойные кавычки (") или одинарные кавычки (') для назначения запроса переменной, например:
Если
where
в вашем запросе есть оператор и / или пытающийсяinsert
получить значение и / илиupdate
значение, которое является строкой, используйте одинарную кавычку (') для таких значений, как:Если вы хотите избежать путаницы при использовании двойных кавычек (") и одинарных кавычек ('), рекомендую придерживаться одинарных кавычек ('), это будет включать обратную косую черту (), например:
Проблема с двойными (") или одиночными (') кавычками возникает, когда нам нужно было присвоить какое-то значение динамически и выполнить некоторую конкатенацию строк, например:
Если требуется дальнейшая очистка, следуйте цитатам в JavaScript
источник