Использование обратных кавычек вокруг имен полей
Вопрос
Прочитав здесь пару ответов и комментариев на некоторые вопросы по SQL, а также услышав, что мой друг работает в месте, где действует политика, запрещающая их, мне интересно, есть ли что-то неправильное в использовании обратных кавычек вокруг имен полей в MySQL. .
То есть:
SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
Решение
Использование обратных галочек позволяет использовать альтернативные символы. При написании запросов это не такая проблема, но если предположить, что вы можете просто использовать обратные пометки, я бы предположил, что это позволит вам избежать нелепых вещей вроде
SELECT `id`, `my name`, `another field` , `field,with,comma`
Что, конечно, генерирует плохо именованные таблицы. Р>
Если вы просто лаконичны, я не вижу в этом проблемы, вы заметите, если вы выполните свой запрос как таковой
EXPLAIN EXTENDED Select foo,bar,baz
Сгенерированное предупреждение, которое будет возвращаться, будет содержать полные имена и с обратными галочками. Поэтому, если вы используете функции генерации запросов и автоматическое переписывание запросов, обратные пометки сделают все, что разбирает ваш код, менее запутанным. Р>
Я думаю, однако, вместо того, чтобы указывать, можете ли вы использовать обратные метки, у них должен быть стандарт для имен. Это решает больше «реальных» проблем. Р>
Другие советы
Единственная проблема с обратными галочками заключается в том, что они не совместимы с ANSI-SQL, например они не работают в SQL Server.
Если есть вероятность, что вам придется перенести SQL-код в другую базу данных, используйте двойные кавычки.
На мой взгляд, имеет смысл всегда использовать их при работе с именами полей.
- Во-первых, как только вы привыкнете, не помешает просто нажать клавишу обратного кавычка.
- Во-вторых, на мой взгляд, это облегчает понимание того, какие именно поля входят в ваш запрос, а что такое ключевые слова или методы.
- Наконец, он позволяет вам использовать любое имя поля при разработке таблицы.Иногда имеет смысл назвать поле «ключом», «порядком» или «значениями»...все из которых требуют обратных кавычек при обращении к ним.
Обратные метки не являются частью стандартного ANSI SQL. Из руководства mysql :
Если режим SQL ANSI_QUOTES включен, также допустимо цитировать идентификаторы в двойных кавычках
Так что, если вы используете обратные пометки, а затем решили отойти от MySQL, у вас есть проблема (хотя у вас, вероятно, также есть и более серьезные проблемы)
Нет ничего плохого, если вы продолжаете использовать MYSQL, за исключением, может быть, визуальной нечеткости запросов. Но они позволяют использовать зарезервированные ключевые слова или встроенные пробелы в качестве имен таблиц и столбцов. Это нет-нет с большинством механизмов баз данных и предотвратит любую миграцию позже.
Что касается удобства чтения, многие люди используют заглавные буквы для ключевых слов SQL, например.
SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
Если вы спросите меня, всегда следует использовать обратные кавычки.Но есть несколько причин, по которым команда может предпочесть их не использовать.
Преимущества:
- При их использовании не используются зарезервированные слова или запрещенные символы.
- В некоторых случаях вы получаете более описательные сообщения об ошибках.
- Если вы избегаете плохих практик, вам все равно, но...на самом деле иногда это хороший способ избежать SQL-инъекций.
Недостатки:
- Они не стандартны и обычно не портативны.Однако до тех пор, пока вы не используете обратные кавычки как часть идентификатора (что является наихудшей практикой, которую я могу себе представить), вы можете перенести свой запрос, автоматически удаляя обратные кавычки.
- Если часть вашего запроса поступает из Access, они могут заключать имена таблиц с помощью " (и, возможно, вы не сможете удалить все " вслепую).Однако допускается сочетание обратных кавычек и двойных кавычек.
- Какое-то глупое программное обеспечение или функция фильтрует ваши запросы и имеет проблемы с обратными кавычками.Однако они являются частью ASCII, поэтому это означает, что ваше программное обеспечение/функция очень плохое.
Ну, насколько я знаю, вся цель использования обратных галочек состоит в том, чтобы вы могли использовать имена, которые совпадают с зарезервированными ключевыми словами. Поэтому, если имя не совпадает с зарезервированным ключевым словом, я не вижу причин использовать обратные пометки. Но это тоже не причина для их запрета.
Гораздо проще найти в базе кода что-то в обратном трюке. Допустим, у вас есть таблица с именем event
. grep -r " событие " *
может вернуть сотни результатов. grep -r " \ `event \` " *
вернет что-либо, возможно, ссылающееся на вашу базу данных. Р>
Простая вещь о обратном кавычке `` используется для обозначения идентификатора, такого как имя_базы_данных, имя_таблицы и т. д., и одинарной кавычки '' , двойной кавычки " " для строковых литералов, тогда как " " используйте для печати значение как оно есть и '' выведите переменную value hold или в другом случае выведите текст, который он имеет.
i.e 1.-> use `model`;
here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");
here i used both quote for all type of requirement. If anything not clear let me know..
если вы используете имена некоторых полей в качестве значений mysql или mssql по умолчанию, например, "status", вы должны использовать обратные метки (" выбрать status
из table_name " или " выбрать идентификатор из table_name где status
= 1 ").
потому что mysql возвращает ошибки или не работает запрос.
Основное использование backticks (`) в SQL - это использовать их в ситуациях, когда вы будете вызывать их снова в следующих предложениях. В любое другое время рекомендуется использовать двойные кавычки (" "). Р>
Например
SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
COUNT(ISBN) AS "# Books",
MAX(LENGTH(title)) AS "Longest Title",
MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;
В приведенном выше утверждении вы видите, как Publisher and Location
снова используется в предложении GROUP BY
.
Вместо использования
GROUP BY Имя, город, код штата
Я только что использовал
GROUP BY
Издатель и местоположение
Только когда такие ситуации возникают, полезно использовать обратные пометки. Во всех остальных случаях рекомендуется использовать двойные кавычки.