Работа с регистром названий столбцов в PostgreSQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

  • Без кавычек (рассматриваются как нижний регистр):

    SQL
    Скопировать код
    -- заглавные буквы будут проигнорированы  
    SELECT columnname FROM table;
  • В кавычках (учитывается указанный регистр):

    SQL
    Скопировать код
    -- только "ColumnName" будет распознано правильно  
    SELECT "ColumnName" FROM table;

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

    Кинга Идем в IT: пошаговый план для смены профессии

    Исследуем подход PostgreSQL к именам столбцов

    Жизнь во власти нижнего регистра

    При отсутствии кавычек PostgreSQL приводит идентификаторы к нижнему регистре:

    SQL
    Скопировать код
    -- Попытка обратиться к несуществующему 'Firstname', имелось в виду 'firstname'?  
    SELECT firstname FROM people;

    Отделение идентификаторов от строковых литералов происходит следующим образом:

    SQL
    Скопировать код
    -- Обращаем внимание: 'FirstName' это строка, а не название столбца.  
    SELECT 'FirstName' FROM people;

    Регистрозависимая работа

    PostgreSQL учитывает регистр символов при заключении имен в двойные кавычки:

    SQL
    Скопировать код
    -- Теперь "FirstName" правильно распознано!  
    SELECT "FirstName" FROM people;

    Но это требует последовательного применения кавычек, что предъявляет высокие требования к памяти!

    Рекомендации по именованию столбцов

    Ставка на нижний регистр

    Использование имен столбцов исключительно в нижнем регистре:

  • Исключает необходимость использования кавычек:

    SQL
    Скопировать код
    -- Всё просто и ясно, регистр не имеет значения.  
    SELECT first_name FROM people;
  • Улучшает читаемость SQL-запросов и снижает риск ошибок.

    Исключаем использование зарезервированных слов

    Воздерживайтесь от использования зарезервированных слов SQL, чтобы избежать конфликтов синтаксиса:

    SQL
    Скопировать код
    -- Слово 'user' может вызвать путаницу.  
    SELECT user FROM accounts;

    Это позволяет делать идентификаторы более описательными и ясными.

    Визуализация

    Приводим взгляд на то, как имена столбцов трансформируются в PostgreSQL, на примере:

    Введенное имяПреобразованное имя
    'Column'column
    'column'column
    'COLUMN'column

    Без кавычек в запросе ищется стандартное 'column', независимо от того, как вы его ввели:

SQL
Скопировать код
-- Запрос вернет 'column', несмотря на использование 'Column' или 'COLUMN' в запросе  
SELECT column FROM table;

С кавычками значение воспринимается точно так, как введено:

SQL
Скопировать код
-- Запрос вернет только 'Column', игнорируя 'column' или 'COLUMN'  
SELECT "Column" FROM table;

Таким образом, без кавычек все имена преобразуются в "column", с кавычками исходное написание сохраняется (например, "Column").

Влияние на разработку и переносимость приложений

Эффект на процесс разработки

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

Python
Скопировать код
  # ORM ожидает соблюдения регистра и написания 'first_name'.  
  Person.objects.get(first_name='John')

Управление миграциями БД

Переход между СУБД или между их версиями может осложняться из-за различий в регистрах. Для изменения имени столбца на нижний регистр:

SQL
Скопировать код
  -- Меняем названия столбцов, адаптируя их к стандартам.  
  ALTER TABLE "People" RENAME COLUMN "FirstName" TO first_name;

Особенности SQL-стандартов

PostgreSQL выделяется на фоне других баз данных SQL:

  • SQL-стандарт по умолчанию приводит имена без кавычек к верхнему регистру.
  • PostgreSQL предпочитает приводить к нижнему регистру.

    Работаем со строковыми константами и идентификаторами

  • Строковые литералы должны быть заключены в одинарные кавычки:

    SQL
    Скопировать код
    -- 'John' представляет значение поля 'first_name'.  
    SELECT * FROM people WHERE first_name = 'John';
  • Для сохранения регистра идентификаторов используйте двойные кавычки:

    SQL
    Скопировать код
    -- Ожидается наличие "FirstName" в запросе.  
    SELECT "FirstName" from people;

    Полезные материалы

    1. PostgreSQL: Документация по идентификаторам с учетом регистра — Подробный обзор правил использования идентификаторов.
    2. Чувствительность PostgreSQL к регистру — Обсуждение этого вопроса на Stack Overflow.
    3. Список зарезервированных слов SQL — Список зарезервированных слов, помогающий избежать конфликтов.
    4. Правила именования в PostgreSQL — Рекомендации PostgreSQL по именованию для избежания неоднозначностей.
    5. Анализ регистрозависимости в PostgreSQL — Статья о регистрозависимости в PostgreSQL.