Проверяете ли вы имена полей и таблиц по спискам зарезервированных слов?

Иногда у меня возникали проблемы с именами хранимых процедур поля, таблицы или средства просмотра. Пример:

   SELECT from, to, rate FROM Table1

Проблема в том, что из - зарезервированное слово в SQL-92. Вы можете заключить имя поля в двойные кавычки, чтобы исправить это, но что, если некоторые другие инструменты db захотят прочитать вашу базу данных? Это ваша конструкция базы данных, и это ваша вина, если у других приложений есть проблемы с вашей базой данных.

Есть много других зарезервированные слова (~ 300), и мы должны избегать их всех. Если вы измените СУБД с производителя A на B, ваше приложение может выйти из строя, потому что некоторые имена полей теперь являются зарезервированными словами. Поле с именем ПРОЦЕНТ может работать для Oracle db, но на сервере MS SQL оно должно рассматриваться как зарезервированное слово.

У меня есть инструмент для проверки дизайна моей базы данных по этим зарезервированным словам; ты тоже?

Вот мои правила

  1. не используйте имена длиннее 32 символов (некоторые СУБД не могут обрабатывать более длинные имена)
  2. используйте только буквы a-z, A-Z, 0-9 и знак подчеркивания (: -;, / &! =? + - не допускаются)
  3. не начинайте имя с цифры
  4. избегайте этих зарезервированных слов
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
1 208
6

Ответы 6

Простой способ: просто убедитесь, что имя поля каждый заключено в кавычки.

Обновлено: любой разумный инструмент БД, достойный своей соли, должен делать то же самое, я, конечно, никогда не сталкивался с какими-либо проблемами (по крайней мере, за пределами моего собственного кода!)

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

Yarik 15.11.2008 13:17

Это имеет значение только тогда, когда вы пишете буквальный SQL, в большинстве случаев этого лучше избегать.

Dan 15.11.2008 19:06

Определенно. Для этой цели у меня есть таблица SQL_RESERVED_WORDS.

Oracle может обрабатывать только 30-символьные имена таблиц, кстати. И все они в верхнем регистре.

Требуется всего час ненужной отладки, прежде чем таблица окупится.

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

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

В конце концов, это выглядит неаккуратно. Намного лучше потратить время на то, чтобы придумать другое слово, которое не противоречит ключевым словам SQL.

Мне ваши правила нравятся.

Просто избегайте зарезервированных слов.

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

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

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

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

    NB: Удобочитаемость может быть особенно нарушена, когда вам нужно сгенерировать код SQL из SQL (так называемый «динамический SQL» подход) или из других языков. Вам не нужны дополнительные двойные кавычки внутри одинарных кавычек, или лишние повторяющиеся двойные кавычки, или экранированные кавычки, или любые другие неясные вещи в этом роде.

    Например, как бы вы хотели такие фрагменты:

    -- SQL -----------------------
    declare @sql as varchar(4000)
    set @sql = 'select "To", "From" from MyTable'
    
    ' VB -------------------------
    Dim sql as String
    sql = "select ""To"", ""From"" from MyTable"
    
    // C++ -----------------------
    String sql = "select \"To\", \"From\" from MyTable"
    
  2. Большинство зарезервированных слов в любом случае являются плохими кандидатами для именования таблиц, столбцов, переменных и т. д. В подавляющем большинстве случаев существительные (иногда прилагательные) намного лучше подходят для имен, чем глаголы, наречия и предлоги. :-)

Я согласен со вторым пунктом Ярика о пригодности зарезервированных слов. В примере с OP он использует «до», «от» и «скорость». Ближайший вопрос, который возникает у меня и, следовательно, возможно, у будущего разработчика: «Куда и от чего?». Возможно, подумайте о переименовании этих столбцов в «EffectiveFromDate» и «EffectiveUntilDate», если это то, что они представляют.

</2c>

Другие вопросы по теме