Работа с регистром названий столбцов в PostgreSQL
Быстрый ответ
В PostgreSQL имена столбцов воспринимаются в нижнем регистре, если они не заключены в двойные кавычки. Для учета регистра используйте двойные кавычки:
Без кавычек (рассматриваются как нижний регистр):
-- заглавные буквы будут проигнорированы SELECT columnname FROM table;
В кавычках (учитывается указанный регистр):
-- только "ColumnName" будет распознано правильно SELECT "ColumnName" FROM table;
Для исключения недоразумений лучше писать имена столбцов без кавычек, в нижнем регистре, либо всегда помните о точном их написании.
Исследуем подход PostgreSQL к именам столбцов
Жизнь во власти нижнего регистра
При отсутствии кавычек PostgreSQL приводит идентификаторы к нижнему регистре:
-- Попытка обратиться к несуществующему 'Firstname', имелось в виду 'firstname'? SELECT firstname FROM people;
Отделение идентификаторов от строковых литералов происходит следующим образом:
-- Обращаем внимание: 'FirstName' это строка, а не название столбца. SELECT 'FirstName' FROM people;
Подробнее об этом расскажет наш спикер на видеоРегистрозависимая работа
PostgreSQL учитывает регистр символов при заключении имен в двойные кавычки:
-- Теперь "FirstName" правильно распознано! SELECT "FirstName" FROM people;
Но это требует последовательного применения кавычек, что предъявляет высокие требования к памяти!
Рекомендации по именованию столбцов
Ставка на нижний регистр
Использование имен столбцов исключительно в нижнем регистре:
Исключает необходимость использования кавычек:
-- Всё просто и ясно, регистр не имеет значения. SELECT first_name FROM people;
Улучшает читаемость SQL-запросов и снижает риск ошибок.
Исключаем использование зарезервированных слов
Воздерживайтесь от использования зарезервированных слов SQL, чтобы избежать конфликтов синтаксиса:
-- Слово 'user' может вызвать путаницу. SELECT user FROM accounts;
Это позволяет делать идентификаторы более описательными и ясными.
Визуализация
Приводим взгляд на то, как имена столбцов трансформируются в PostgreSQL, на примере:
Введенное имя Преобразованное имя 'Column' column 'column' column 'COLUMN' column Без кавычек в запросе ищется стандартное 'column', независимо от того, как вы его ввели:
-- Запрос вернет 'column', несмотря на использование 'Column' или 'COLUMN' в запросе
SELECT column FROM table;
С кавычками значение воспринимается точно так, как введено:
-- Запрос вернет только 'Column', игнорируя 'column' или 'COLUMN'
SELECT "Column" FROM table;
Таким образом, без кавычек все имена преобразуются в "column", с кавычками исходное написание сохраняется (например, "Column").
Влияние на разработку и переносимость приложений
Эффект на процесс разработки
Сохранение консистентности критично: несоблюдение может вызвать ошибки в приложениях, особенно при интеграции с ORM:
# ORM ожидает соблюдения регистра и написания 'first_name'.
Person.objects.get(first_name='John')
Управление миграциями БД
Переход между СУБД или между их версиями может осложняться из-за различий в регистрах. Для изменения имени столбца на нижний регистр:
-- Меняем названия столбцов, адаптируя их к стандартам.
ALTER TABLE "People" RENAME COLUMN "FirstName" TO first_name;
Особенности SQL-стандартов
PostgreSQL выделяется на фоне других баз данных SQL:
- SQL-стандарт по умолчанию приводит имена без кавычек к верхнему регистру.
PostgreSQL предпочитает приводить к нижнему регистру.
Работаем со строковыми константами и идентификаторами
Строковые литералы должны быть заключены в одинарные кавычки:
-- 'John' представляет значение поля 'first_name'. SELECT * FROM people WHERE first_name = 'John';
Для сохранения регистра идентификаторов используйте двойные кавычки:
-- Ожидается наличие "FirstName" в запросе. SELECT "FirstName" from people;
Полезные материалы
- PostgreSQL: Документация по идентификаторам с учетом регистра — Подробный обзор правил использования идентификаторов.
- Чувствительность PostgreSQL к регистру — Обсуждение этого вопроса на Stack Overflow.
- Список зарезервированных слов SQL — Список зарезервированных слов, помогающий избежать конфликтов.
- Правила именования в PostgreSQL — Рекомендации PostgreSQL по именованию для избежания неоднозначностей.
- Анализ регистрозависимости в PostgreSQL — Статья о регистрозависимости в PostgreSQL.