Дополнительно
Когда использовать одинарные кавычки, двойные кавычки и обратные знаки в MySQL
Я пытаюсь узнать, как лучше писать запросы. Я также понимаю, как важно быть последовательным. До сих пор я беспорядочно использовал одинарные кавычки, двойные кавычки и обратные знаки, не задумываясь об этом.
Пример:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Также в приведенном выше примере учтите, что table
, col1
, val1
и т.д. могут быть переменными.
Каков стандарт для этого? Как вы поступаете?
Я'читаю ответы на подобные вопросы здесь уже около 20 минут, но кажется, что окончательного ответа на этот вопрос нет.
602
12
Обратные знаки должны использоваться для идентификаторов таблиц и столбцов, но они необходимы только тогда, когда идентификатор является 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), не должны заключаться в кавычки, хотя на их аргументы распространяются те же правила цитирования строк или идентификаторов, о которых уже говорилось.Переменная интерполяция
Кавычки для переменных не меняются, хотя если вы собираетесь интерполировать переменные непосредственно в строку, то в PHP она должна быть заключена в двойные кавычки. Убедитесь, что вы правильно экранировали переменные для использования в SQL. (Для защиты от SQL-инъекций рекомендуется использовать API с поддержкой подготовленных операторов).
Подготовленные заявления
При работе с подготовленными утверждениями обратитесь к документации, чтобы определить, нужно ли заключать в кавычки заполнители утверждения. Наиболее популярные API, доступные в PHP, PDO и MySQLi, предполагают использование некавычек, как и большинство API подготовленных операторов в других языках:
Символы, требующие обратного тика в идентификаторах:
Согласно документации MySQL, вам не нужно заключать в кавычки (обратный знак) идентификаторы, использующие следующий набор символов:
В качестве идентификаторов таблиц или столбцов можно использовать символы, выходящие за пределы этого набора, например, пробельные символы, но тогда вы должны заключить их в кавычки (обратный знак).
Существует два типа кавычек в MySQL:
`
для ограждающих идентификаторы, такие как имена таблиц и столбцовИ потом есть в
"
, который представляет собой особый случай. Он может быть использован для one вышеперечисленных целей в момент, в зависимости от сервера MySQL'ыsql_mode
:"
Символ может быть использован для заключайте строковые литералы как'
ANSI_QUOTES
режиме в"
Символ может быть использован, чтобы заключать идентификаторы прям как в <код> в`</код>Следующий запрос будет производить различные результаты (или ошибки) в зависимости от режима SQL:
ANSI_QUOTES отключены
Запрос будет выбирать строковый литерал в
"; баре" колонка"
в которых столбецFoo
- это равные строки в"
ANSI_QUOTES включено
Запрос будет выбирать столбец, колонка
, где столбец
Foo- это равный столбцу
бар`Когда следует использовать то, что
"
, так что ваш код становится независимым от режимы SQL(Есть хорошие ответы выше по поводу SQL и характеру вашего вопроса, но это также может быть актуальным, если вы новичок в PHP.)
Пожалуй, важно отметить, что PHP обрабатывает одиночных и двойных кавычках по-разному...
Одинарные кавычки строки 'литералы' и в значительной степени визуальный строк. Двойные кавычки интерпретируются по PHP для возможной переменной-замена (обратные кавычки в PHP не точно струны; они выполнить команду в командной строке и возвращает результат).
Примеры:
Обратные знаки обычно используются для указания
идентификатора
, а также для защиты от случайного использования Зарезервированных ключевых слов.Например:
Здесь обратные символы помогут серверу понять, что
database
- это имя базы данных, а не идентификатор базы данных.То же самое можно сделать для имен таблиц и полей. Это очень хорошая привычка, если вы обернете идентификатор базы данных обратными знаками.
Теперь о двойных кавычках и одинарных кавычках (Майкл уже упоминал об этом).
Но для определения значения нужно использовать либо одинарные, либо двойные кавычки. Рассмотрим другой пример.
Здесь я намеренно забыл заключить
title1
в кавычки. Теперь сервер восприметtitle1
как имя столбца (т.е. идентификатор). Поэтому, чтобы указать, что это значение, нужно использовать двойные или одинарные кавычки.Теперь, в сочетании с PHP, двойные и одинарные кавычки значительно облегчают написание запросов. Давайте посмотрим на модифицированную версию запроса из вашего вопроса.
Теперь, используя двойные кавычки в PHP, вы заставите переменные
$val1
и$val2
использовать свои значения, создав тем самым вполне корректный запрос. Например,сделает
В MySQL, эти символы используются для определения запроса``
, в
",
'и
()` .в
"
и' используются для ограждения строковые значения в
"26-01-2014 00:00:00"В или
'26-01-2014 00:00:00'. Эти символы предназначены только для строк, а не агрегатные функции, такие как
теперь,
сумма, или
Max`.`
используется для заключать имена таблиц или столбцов, например,выберите `имя_столбца` от `имя_таблицы` где id='2'
(
и)
просто заключите части запроса, например,выберите `имя_столбца` от `имя_таблицы`, где (идентификатор='2' и пол='мужчина') или name='Ракеш'
.Строковые литералы в MySQL и PHP такие же.
Так что если ваша строка содержит одинарные кавычки, то вы можете использовать двойные кавычки, чтобы процитировать строки, или если он содержит двойные кавычки, то вы можете использовать одинарные кавычки, чтобы заключить строку в кавычки. Но если ваша строка содержит одинарные кавычки и двойные кавычки, вы должны защитить тот что б процитировать строки.
В основном, мы используем одиночные кавычки для строковых значений в SQL, так что мы должны использовать двойные кавычки для строки PHP.
И вы могли бы использовать переменную в PHP's двойной кавычки:
Но если
$val1
или$val2
содержит одинарные кавычки, которые сделают ваш SQL будет неправильно. Так что вам нужно, чтобы защитить его, прежде чем он используется в SQL; это то, чтоиспользования mysql_real_escape_string
для. (Хотя подготовленном заявлении лучше.)В сочетание PHP и MySQL, двойные кавычки и одинарные кавычки сделать ваш запрос-писать время намного проще.
Теперь предположим, что вы используете Прямая почтовая переменную в запрос MySQL затем использовать это так:
Это лучше всего использовать переменные PHP в MySQL.
Там было много полезных ответов здесь, как правило, завершающихся в два очка.
И как @MichaelBerkowski сказал
Хотя есть случай, когда идентификатор не может ни быть зарезервированное ключевое слово или содержать пробел или символы за пределами ограниченного набора но обязательно требуют обратные кавычки вокруг них.
Пример
123E10
- это допустимое имя идентификатора, но и действительноецелое число
литерал.[Не вдаваясь в детали, как бы вы получить такой идентификатор], предположим, я хочу создать временную таблицу с именем
123456e6
.Никакой ошибки на обратные апострофы.
Ошибка, когда не используя обратные кавычки.
Однако, 123451a6-это прекрасно идентификатор (без клещей).
Это полностью, потому что 1234156e6 также экспоненциального числа.
Если столбцы таблицы и значения являются переменными, то есть два способа:
С двойными кавычками
"""
полный запрос:Или
С одинарными кавычками
''
:Используйте обратные галочки `````````````, когда имя столбца/значения похоже на зарезервированное ключевое слово MySQL.
Примечание: Если вы обозначаете имя столбца именем таблицы, то используйте обратные тики следующим образом:
имя_таблицы``.
имя_столбца`` ``Одинарные кавычки должны использоваться для строковых значений, как в values() список.
Обратные кавычки используются, чтобы указать идентификатор, а также быть безопасным от случайного использования зарезервированных ключевых слов.
В сочетание PHP и MySQL, двойные кавычки и одинарные кавычки сделать запрос писать время намного проще.
Кроме того, все (хорошо объяснил) ответы, есть еще'т было лет и я посещаю этот Q&довольно часто.
В двух словах; MySQL сервер думает, что вы хотите сделать математику на собственном столбце таблицы/и интерпретирует дефисы, таких как "Электронная почта" и как
е
минуспочта
.Предупреждение: так я думал, я хотел бы добавить это как-то "фу" и типа ответа для тех, кто новичок в работе с базами данных, а кто не может разобраться в технических терминах описал уже.
Серверы SQL и MySQL, PostgreySQL, Оракул Дон'т понять двойные кавычки(") смотрите. Таким образом, ваш запрос должен быть свободен от двойных кавычек(") смотрите и используйте только одинарные кавычки(').
Туда-обратно(`) является обязательным для использования в SQL и используется имя таблицы, имя базы данных и имена столбцов.
Если вы пытаетесь написать запрос в спине-конец вызова MySQL, то можно использовать двойные кавычки(" У) или одинарные кавычки(') для назначения запроса переменной, как:
Если там'ы
, где
заявление в вашему запросу и/или пытаются "вставить" значение и/илиобновить
Из значение строки используйте одинарные кавычки(') для таких значений, как:Если вы хотите, чтобы держаться подальше от этой путаницы, когда использовать двойные кавычки(") смотрите и одинарных кавычек('), рекомендую придерживаться одиночных кавычек(') Это включает обратную косую черту (), как:
Проблема с двойным (и") или один(') цитаты возникают, когда мы должны были назначить какую-то ценность динамических и выполнять некоторые конкатенации строк, как:
Если нужна дополнительная зазор выполните кавычки в JavaScript