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


172

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

То есть:

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

24
обратные кавычки действительно удобно , если вы хотите , чтобы имена столбцов , как count, type, tableили аналогичные
knittl


@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

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

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

19
Вы также должны добавить, что он защищает вас от любых будущих зарезервированных слов, которые используются (что укусило меня раньше).
Алекс

5
Я на самом деле попросил кого-то отредактировать лишние обратные пометки из одного из моих вопросов, что меня расстроило, поскольку именно по этой причине я и окружаю каждую переменную ими
Брайан Лейшман

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

26

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

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

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


9

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

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

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

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

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

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

Недостатки:

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

9
Использование обратных кавычек не имеет абсолютно никакого отношения к предотвращению SQL-инъекций.
Энди Лестер

6
@ и это может помочь, так как злоумышленник должен закрыть его с помощью другого обратного удара, чтобы ввести его. Это мало что делает, но это все еще что-то
jasonszhao

4

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


В общем, это не совсем выгодно. Таблицы, с которыми профессионально сталкиваются, называются больше как 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 возвращает ошибки или не работает запрос.


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.