Что стандарт SQL говорит об использовании backtick (`)?

Как только я потратил часы на отладку простого SQL-запроса, используяmysql_query() вPHP/MySQL только для того, чтобы понять, что я пропустил бактику вокруг названия стола. С тех пор я всегда использовал это для имен таблиц.

Но когда я использовал то же самое вSQLite/C++, символ даже не распознается. Это сбивает с толку, использовать это или нет? Что стандарт говорит об использовании этого?

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

Ответы на вопрос(1)

Решение Вопроса

2011, состоит из нескольких частей) ничего не говорит о символе «обратная галочка» или «обратная кавычка» (Unicode U + 0060 или GRAVE ACCENT); он не распознает его как символ со специальным значением, которое может появиться в SQL.

Стандартный механизм SQL для цитирования идентификаторов с идентификаторами с разделителями, заключенными в двойные кавычки:

SELECT "select" FROM "from" WHERE "where" = "group by";

В MySQL это может быть написано:

SELECT `select` FROM `from` WHERE `where` = `group by`;

В MS SQL Server это можно написать:

SELECT [select] FROM [from] WHERE [where] = [group by];

Проблема с нотацией стандарта SQL заключается в том, что программисты на Си привыкли заключать строки в двойные кавычки, поэтому большинство СУБД используют двойные кавычки в качестве альтернативы одинарным кавычкам, распознаваемым стандартом. Но тогда возникает проблема, когда вы хотите заключить идентификаторы.

Microsoft выбрал один подход; MySQL взял другой; Informix допускает взаимозаменяемое использование одинарных и двойных кавычек, но если вы хотите идентификаторы с разделителями, вы устанавливаете переменную среды, а затем вы должны следовать стандарту (одинарные кавычки для строк, двойные кавычки для идентификаторов); DB2 следует только стандарту, AFAIK; SQLite, кажется, следует стандарту; Оракул также, кажется, следует за стандартом; Похоже, что Sybase допускает либо двойные кавычки (стандартные), либо квадратные скобки (как в MS SQL Server - это означает, что SQL Server может также разрешать двойные кавычки). Это Страницы документирует все эти серверы (и это помогло заполнить пробелы в моих знаниях) и отмечает, являются ли строки внутри идентификаторов с разделителями чувствительными к регистру или нет.

Что касается того, когда использовать механизм цитирования вокруг идентификаторов, мое отношение - «никогда». Ну, не совсем никогда, но только тогда, когда это абсолютно необходимо.

Обратите внимание, что идентификаторы с разделителями чувствительны к регистру; то есть,"from" а также"FROM" ссылаются на разные столбцы (в большинстве СУБД - см. URL выше). Большая часть SQL не чувствительна к регистру; Это неприятно знать, какой случай использовать. (Стандарт SQL имеет ориентацию на мэйнфреймы - он ожидает преобразования имен в верхний регистр; хотя большинство СУБД преобразует имена в нижний регистр.)

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

Еще одним источником проблем являются обновления, когда имя столбца, которое не было ключевым словом в выпуске N, становится ключевым словом в выпуске N + 1. Существующий SQL, который работал до обновления, перестает работать впоследствии. Тогда, по крайней мере, в качестве краткосрочной меры, вы можете быть вынуждены процитировать имя. Но в ходе обычных событий вы должны стремиться избегать кавычек идентификаторов.

Конечно, мое отношение окрашено тем фактом, что Informix (с которым я в основном работаю) принимает этот дословно SQL, в то время как большинство СУБД будет его подавлять:

CREATE TABLE TABLE
(
    DATE    INTEGER NOT NULL,
    NULL    FLOAT   NOT NULL,
    FLOAT   INTEGER NOT NULL,
    NOT     DATE    NOT NULL,
    INTEGER FLOAT   NOT NULL
);

Конечно, человек, который производит такой нелепый стол для чего-то кроме демонстрационных целей, должен быть повешен, нарисован, расквартирован, а затем должны быть сделаны остатки, чтобы исправить беспорядок, который они создали. Но в некоторых пределах, которые клиенты обычно используют, ключевые слова могут использоваться как идентификаторы во многих контекстах. Это само по себе полезная форма будущего. Если слово становится ключевым словом, существует умеренная вероятность того, что существующий код продолжит работать без изменений. Однако механизм не идеален; вы не можете создать таблицу со столбцом PRIMARY, но вы можете изменить таблицу, чтобы добавить такой столбец. Есть причина идиосинкразии, но ее трудно объяснить.

 FrancescoMM23 янв. 2015 г., 16:45
Хотя я не всегда согласен, мне очень понравился этот ответ, и он очень помог мне, +1 спасибо. Я все еще буду продолжать использовать обратные трюки, хотя! :) Меня больше беспокоит то, что многие старые программы неожиданно перестают работать, чем необходимость передавать запросы в функцию преобразования, которая заменяет обратные метки на [и]есл Я могу изменить базу данных ..

Ваш ответ на вопрос