2008-11-04 2 views
146

После прочтения нескольких ответов и комментариев по некоторым вопросам SQL здесь, а также, услышав, что мой друг работает в месте, которое имеет политику, которая их запрещает, мне интересно, есть ли что-то неправильное с использованием обратных ссылок вокруг имен полей в MySQL.Использование обратных ссылок вокруг названий полей

То есть:

SELECT `id`, `name`, `anotherfield` ... 
-- vs -- 
SELECT id, name, anotherfield ... 
+16

обратные кавычки действительно удобно, если вы хотите, чтобы имена столбцов, как `count`,` `type`, table` или аналогичные – knittl 2010-08-30 20:42:48

+0

смотри также http://stackoverflow.com/questions/23446377/syntax-error- из-за-использования-a-reserved-word-as-a-table-or-column-name-in-mysql – 2014-05-06 10:10:34

ответ

136

Использование backticks позволяет использовать альтернативные символы. В запросе писать это не такая проблема, но если предположить, что вы можете просто использовать кавычку, я бы предположить, что это позволит вам уйти с нелепой вещью, как

SELECT `id`, `my name`, `another field` , `field,with,comma` 

, который делает конечно генерировать плохо именованные таблицы.

Если вы только сжатости я не вижу проблем с этим, вы обратите внимание, если вы запускаете запрос в качестве такого

EXPLAIN EXTENDED Select foo,bar,baz 

Сформированный предупреждения, которая возвращается будет обратно- тики и полные имена таблиц. Поэтому, если вы используете функции генерации запросов и автоматическую переписку запросов, обратные ссылки сделают что-нибудь более сильным, чем ваш код.

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

4

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

41

Для меня это имеет смысл использовать их всегда при работе с именами полей.

  • Во-первых, как только вы попадаете в привычку, вам не больно просто ударить по ключу.
  • Во-вторых, для меня это упрощает просмотр того, что именно есть поля в вашем запросе, а также ключевые слова или методы.
  • Наконец, это позволяет вам использовать любое имя поля, которое вы хотите при разработке своей таблицы. Иногда имеет смысл называть поле «ключ», «порядок» или «значения» ... все из которых требуют обратных ссылок при обращении к ним.
+14

Вы также должны добавить, что он защищает вас от любых используемых в будущем зарезервированных слов (которые укусили меня раньше) , – alex 2010-09-17 00:28:37

+5

У меня на самом деле кто-то редактировал лишние обратные ссылки из одного из моих вопросов один раз, что меня расстроило, так как именно по этой причине я окружаю каждую переменную ими. – 2015-04-08 16:33:32

+2

Это также позволяет безопасно использовать неанглийские ярлыки, которых достаточно поощрять использование обратных ссылок. – Aternus 2016-08-25 08:40:18

48

Единственная проблема с backticks заключается в том, что они не совместимы с ANSI-SQL, например. они не работают в SQL Server.

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

+13

Да. Используйте режим ANSI MySQL - http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - чтобы включить двойные кавычки в MySQL и таким образом восстановить совместимость между базами данных. Backticks/quotes также необходимы, потому что вы никогда не знаете, что станет зарезервированным словом в будущих версиях СУБД. – bobince 2008-11-04 10:55:30

+1

Это очень верно! Одно из наших серверных приложений работает нормально, пока мы не применили обновление к нашему механизму базы данных, в котором добавлено новое ключевое слово. Внезапно все, что спровоцировало конкретный стол, сломалось. – Miquella 2008-11-19 17:33:26

20

Backticks не входят в стандартный ANSI SQL.От the mysql manual:

Если режим ANSI_QUOTES SQL включена , также допустимо цитировать идентификаторы в двойных кавычках

Так что, если вы используете кавычку, а затем решили отойти от MySQL, вам (хотя у вас, вероятно, есть и много больших проблем)

7

Нет ничего плохого в том, что вы продолжаете использовать MYSQL, за исключением, может быть, визуальной неясности запросов. Но они позволяют использовать зарезервированные ключевые слова или встроенные пространства в качестве имен таблиц и столбцов. Это не-no с большинством движков баз данных и предотвратит любую миграцию позднее.

Что касается простого чтения, многие используют кепки для ключевых слов SQL, например.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL; 
6

Это намного проще найти в базе кода для чего-то в обратном направлении. Скажем, у вас есть таблица с именем event. grep -r "event" * может вернуть сотни результатов. grep -r "\`event\`" * вернет что-нибудь, возможно, ссылаясь на вашу базу данных.

5

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

Преимущества:

  • Используя их, нет зарезервированных слов или запрещенных символов.
  • В некоторых случаях вы получаете более подробные сообщения об ошибках.
  • Если вы избегаете плохих практик, вам все равно, но ... в реальном слове иногда они являются достойным способом избежать инъекций SQL.

Недостатки:

  • Они не являются стандартными и, как правило, не переносимы. Однако, пока вы не используете обратную линию как часть идентификатора (что является наихудшей практикой, которую я могу себе представить), вы можете переносить свой запрос, автоматически удаляя обратные вызовы.
  • Если некоторые из ваших запросов поступают из Access, они могут указывать имена таблиц «(и, возможно, вы не можете удалить все« слепо »). Тем не менее, допускаются смеси обратных выступов и двойных кавычек.
  • Некоторые глупые программы или функции фильтруют ваши запросы и имеют проблемы с обратными окнами. Однако они являются частью ASCII, поэтому это означает, что ваше программное обеспечение/функция очень плохая.
0

если вы используете некоторые имена полей, как по умолчанию MySQL или MSSQL значений, например «статус», вы должны использовать кавычку («выберите status из table_name» или «выберите идентификатор из table_name, где status = 1»). , потому что mysql возвращает ошибки или не выполняет запрос.

1

Простой вещь о кавычке `` является использование для идентификатора обозначает как имя_базы_данные, table_name и т.д., и одинарных кавычек «», двойные кавычки «» для строковых литералов, в то время как «» использовать для значения печати, как это is и '' печатать значение переменной 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.. 
Смежные вопросы