Использование обратных галочек вокруг имен полей

172

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

То есть:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
nickf
источник
24
обратные кавычки действительно удобно , если вы хотите , чтобы имена столбцов , как count, type, tableили аналогичные
knittl
1
см. также stackoverflow.com/questions/23446377/…
Ян Рингроз
@knittl Я думаю , что вопрос, должны у вас есть имена столбцов , как count, typeи table. Это ужасно неоднозначные термины, и почти в каждом случае эти имена можно было бы улучшить, чтобы быть более конкретными. Присвоение именам таких столбцов также опасно и может стать источником ошибок, поскольку вы никогда не знаете, когда кто-то может забыть добавить обратные пометки или не осознает, что должен это делать. Я думаю, что лучше избегать использования зарезервированных терминов в качестве имен столбцов.
Даллин
Я использую их всегда, и поэтому я не нахожусь в опасности, используя зарезервированные ключевые слова в любое время.
Маркус Целлер

Ответы:

153

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

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

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

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

EXPLAIN EXTENDED Select foo,bar,baz 

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

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

Кент Фредрик
источник
Нужно ли использовать их и в PostgreSQL?
Юсуф Мемон
5
Там нет необходимости, только рекомендации. Полезно представлять их в кавычках, чтобы избежать двусмысленности с ключевыми словами SQL, если в будущем будет добавлено ключевое слово SQL, которое разделяет имя ваших полей. Единственный раз, когда вам нужно / нужно / цитировать, например, когда поле имеет одно и то же ключевое слово, например, select count from foovs select "count" from fooдаст очень разные результаты. Но postgres отличается от mysql двумя способами: 1. Поля цитируются "". 2. Поля без кавычек нечувствительны к регистру postgresql.org/docs/current/static/…
Кент Фредрик
57

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

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

Александр Кожевников
источник
15
Ага. Используйте режим MySQL ANSI - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - чтобы включить двойные кавычки в MySQL и тем самым восстановить совместимость между базами данных. Кавычки / кавычки также необходимы, потому что вы никогда не знаете, что станет зарезервированным словом в будущих версиях СУБД.
бобинце
1
Это очень верно! Одно из наших серверных приложений работало нормально, пока мы не применили обновление к нашей базе данных, которое добавило новое ключевое слово. Внезапно все, что запрашивало конкретный стол, сломалось.
Микелла
@bobince Когда я был новым для разработчика, я назвал столбец rangeили что - то подобное. Когда мы обновились до MySQL 5, это не удалось, потому что это было новое зарезервированное слово!
Алекс
1
Не используйте двойные кавычки. Это не всегда будет работать. Например ... УДАЛИТЬ ОТ app_key_storesГДЕ ("ключ" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Запрос в порядке, затронуто 0 строк (0,00 с) УДАЛИТЬ ОТ app_key_storesГДЕ ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Запрос в порядке, затронуто 5 строк (0,00 с)
Altonymous
44

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

  • Во-первых, как только вы вошли в привычку, не больно просто нажать клавишу обратного удара.
  • Во-вторых, для меня легче понять, какие именно поля в вашем запросе, а какие ключевые слова или методы.
  • Наконец, он позволяет вам использовать любое имя поля, которое вы пожелаете, при разработке таблицы. Иногда имеет смысл назвать поле "ключ", "порядок" или "значения" ... все из которых требуют обратных ссылок при обращении к ним.
nickf
источник
19
Вы также должны добавить, что он защищает вас от любых будущих зарезервированных слов, которые используются (что укусило меня раньше).
Алекс
5
Я на самом деле попросил кого-то отредактировать лишние обратные пометки из одного из моих вопросов, что меня расстроило, поскольку именно по этой причине я и окружаю каждую переменную ими
Брайан Лейшман
2
Это также позволяет безопасно использовать не английские метки, которых достаточно, чтобы поощрять использование меток.
Aternus
26

Обратные знаки не являются частью стандартного ANSI SQL. Из руководства по MySQL :

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

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

Greg
источник
9

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

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

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
Кристиан Лескуйер
источник
6

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

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

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

Недостатки:

  • Они не стандартные и обычно не переносимые. Однако, если вы не используете обратный тик в качестве части идентификатора (это худшая практика, которую я могу себе представить), вы можете портировать свой запрос, автоматически удаляя обратные тики.
  • Если некоторые из ваших запросов поступают из Access, они могут заключать в кавычки имена таблиц с помощью «(и, возможно, вы не можете удалить все» вслепую). Тем не менее, допускается смешение обратных кавычек и двойных кавычек.
  • Некоторые глупые программы или функции фильтруют ваши запросы и имеют проблемы с обратными галочками. Тем не менее, они являются частью ASCII, так что это означает, что ваше программное обеспечение / функция очень плохая.
Federico
источник
9
Использование обратных кавычек не имеет абсолютно никакого отношения к предотвращению SQL-инъекций.
Энди Лестер
6
@ и это может помочь, так как злоумышленник должен закрыть его с помощью другого обратного удара, чтобы ввести его. Это мало что делает, но это все еще что-то
jasonszhao
4

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

EllisGL
источник
В общем, это не совсем выгодно. Таблицы, с которыми профессионально сталкиваются, называются больше как new_users_info, а не как «общие».
ankush981
3

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

Крис Шут-Янг
источник
2

Простая вещь о backtick `` используется для обозначения идентификатора, такого как database_name, table_name и т. Д., И одинарная кавычка '' , двойная кавычка "" для строковых литералов, тогда как "" используется для вывода значения в том виде, как оно есть, и '' печать значения переменной 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..
Сонпал Сингх Сенгар
источник
0

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

ysrtymz
источник
0

Основное использование обратных символов (`) в 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 Наименование, город, код штата

Я просто использовал

ГРУППА ПО Publisher and Location

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

команда
источник