Використання зворотних посилань навколо імен полів


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?
Yousuf Memon

5
Немає потреби, лише рекомендація. Корисно представити їх цитованими, щоб уникнути неоднозначності з ключовими словами SQL, якщо надалі буде додано ключове слово SQL, яке розділяє назву ваших полів. Єдиний раз, коли вам потрібно / цитувати, - це поле робить спільно ім'я ключового слова, наприклад, select count from fooпроти select "count" from fooдасть дуже різні результати. Але postgres відрізняється від mysql двома способами: 1. Поля цитуються "". 2. Поле без котирування є нечутливим до регістру postgresql.org/docs/current/static/…
Кент Фредрік

57

Єдина проблема із backticks полягає в тому, що вони не відповідають стандартам ANSI-SQL, наприклад, вони не працюють у SQL Server.

Якщо є шанс, вам доведеться перенести свій SQL до іншої бази даних, використовуйте подвійні лапки.


15
Так. Використовуйте режим ANSI MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - для ввімкнення подвійних лапок в MySQL і тим самим відновлення сумісності міжбазових баз даних. Повернення / цитати також необхідні, оскільки ви ніколи не знаєте, що стане зарезервованим словом у майбутніх версіях СУБД.
bobince

1
Це дуже правда! Одне з наших серверних додатків працювало чудово, поки ми не застосували оновлення до системи двигуна бази даних, яка додала нове ключове слово. Раптом усе, що запитувало певний стіл, зламалося.
Мікелла

@bobince Коли я був новим у розробці , я назвав колонку rangeчи щось подібне. Коли ми оновили MySQL 5, це не вдалося, оскільки це було нове зарезервоване слово!
алекс

1
Не використовуйте подвійні лапки. Це не завжди вийде. Наприклад ... ВИДАЛИТИ З app_key_storesЧОГО ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Запит OK, 0 рядків уражено (0,00 сек.) ВИДАЛИТИ З ЧОГО app_key_stores( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Запит ОК, 5 рядків зачеплені (0,00 сек)
Альтонім

44

Мені має багато сенсу використовувати їх у будь-який час під час роботи з іменами полів.

  • По-перше, як тільки ви увійдете в звичку, не завадить просто натиснути клавішу "backtick".
  • По-друге, мені полегшується зрозуміти, які саме поля є у вашому запиті, а що таке ключові слова чи методи.
  • Нарешті, це дозволяє використовувати будь-яку назву поля при бажанні під час проектування таблиці. Іноді має сенс називати поля "ключ", "порядок" або "значення" ... всі вони вимагають зворотних посилань при посиланні на них.

19
Слід також додати, що він захищає вас від будь-яких майбутніх зарезервованих слів, які використовуються (що мене раніше покусало).
alex

5
Насправді мені хтось один раз редагував зайві беккетки з мого запитання, що мене засмутило, оскільки саме ця причина є точною причиною, коли я оточую кожну змінну з ними
Брайан Лейшман

2
Це також дозволяє безпечно використовувати не англійські етикетки, що одного лише достатньо, щоб заохотити використання задніх посилань.
Aternus

26

Повернення не є частиною стандартного ANSI SQL. З посібника з mysql :

Якщо ввімкнено режим SSI ANSI_QUOTES SQL, також можна допустити котирування ідентифікаторів у межах подвійних лапок

Тож якщо ви використовуєте backticks, а потім вирішите відійти від MySQL, у вас є проблема (хоча, ймовірно, у вас є і набагато більші проблеми)


9

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

Що стосується легкого читання, багато людей використовують літери для ключових слів SQL, наприклад.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

Якщо ви запитаєте у мене, завжди слід використовувати підставки. Але є деякі причини, чому команда може вважати за краще не використовувати їх.

Переваги:

  • Використовуючи їх, немає застережених слів чи заборонених символів.
  • У деяких випадках ви отримуєте більше описових повідомлень про помилки.
  • Якщо ви уникаєте поганих практик, то вам все одно, але ... по-справжньому, іноді вони є гідним способом уникнути ін'єкцій SQL.

Недоліки:

  • Вони не є стандартними і зазвичай не є портативними. Однак, поки ви не використовуєте backtick як частину ідентифікатора (що є найгіршою практикою, яку я можу собі уявити), ви можете перенести свій запит, автоматично видаляючи посилання.
  • Якщо деякі ваші запити надходять із Access, вони можуть цитувати назви таблиць з "(а можливо, ви не можете видалити всі" наосліп). Однак дозволені суміші зворотних посилань та подвійних лапок.
  • Якесь дурне програмне забезпечення чи функція фільтрує ваші запити та має проблеми із зворотними посиланнями. Однак вони є частиною ASCII, тому це означає, що ваше програмне забезпечення / функція дуже погана.

9
Використання зворотних посилань не має нічого спільного з уникненням ін'єкцій SQL.
Енді Лестер

6
@і це може допомогти, оскільки зловмисник повинен закрити його ще однією рукою. Це мало, але це все-таки щось
jasonszhao

4

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


Взагалі це не дуже користь. Таблиці, до яких професійно потрапляє, називаються більше як new_users_info, ніж "загальні".
ankush981

3

Наскільки я знаю, ціль використання backticks полягає в тому, щоб ви могли використовувати імена, які співпадають із зарезервованими ключовими словами. Отже, якщо ім’я не стикається із зарезервованим ключовим словом, я не бачу жодної причини використовувати зворотні посилання. Але це теж не є причиною забороняти їх.


2

Проста річ про backtick `` - це використання для позначення ідентифікатора, такого як ім'я бази даних, імені таблиці і т.д. тощо, і одинарна цитата '' , подвійне цитування "" для рядкових літералів, тоді як "" використання для значення друку як є і "" надрукувати значення змінної утримувати або в іншому випадку надрукуйте його текст.

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з імені таблиці" або "вибрати ідентифікатор з імені таблиці де 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п.

Замість використання

ГРУПА ЗА Назва, місто, державний код

Я просто використовував

ГРУПА ПО Publisher and Location

Тільки тоді, коли виникають подібні ситуації, корисно використовувати зворотній зв'язок. В інший час рекомендується використовувати подвійні лапки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.