В именах столбцов PostgreSQL учитывается регистр?


157

У меня есть таблицы БД сказать, personsв Postgres передавалась другой командой , которая имеет имя столбца сказать, "first_Name". Сейчас я пытаюсь использовать PG Commander для запроса этой таблицы по этому столбцу-имени.

select * from persons where first_Name="xyz";

И это только возвращает

ОШИБКА: столбец "first_Name" не существует

Не уверен, что я делаю что-то глупое или есть способ обойти эту проблему, которую я упускаю?

Ответы:


284

Все идентификаторы (включая имена столбцов), которые не заключены в двойные кавычки, в PostgreSQL свернуты в нижний регистр. Имена столбцов, которые были созданы с двойными кавычками и, таким образом, сохранили заглавные буквы (и / или другие нарушения синтаксиса), должны быть заключены в двойные кавычки на всю оставшуюся жизнь: ( "first_Name")

Итак, да , имена столбцов PostgreSQL чувствительны к регистру:

SELECT * FROM persons WHERE "first_Name" = 'xyz';

Также исправьте неправильные двойные кавычки вокруг 'xyz'. Значения (строковые литералы) заключаются в одинарные кавычки .

Прочтите руководство здесь.

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


4
@ArtB: стандарт SQL определяет идентификаторы без учета регистра, так же, как это реализует Postgres. Единственное отклонение: идентификаторы без кавычек в стандарте складываются в верхний регистр, но строчные строчные - все, что не заключено в двойные кавычки. (Уместно только в редких угловых случаях.) Подробности в руководстве здесь.
Эрвин Брандштеттер,

1
@adfs: я не думаю, что могу объяснить это лучше, чем я уже сделал. Для получения дополнительной информации перейдите по ссылке на руководство, которое я неоднократно предоставлял.
Эрвин Брандштеттер,

15
@adfs: В SQL foobar, FOOBARи FooBarэто тот же идентификатор. Тем не менее "foobar", "FooBar"и "FOOBAR"разные идентификаторы
a_horse_with_no_name

5
@a_horse_with_no_name да, но под SQL foobarи FOOBARтакие же, как "FOOBAR"под potgresql FOOBARи foobarт. д. такие же, как "foobar".
Jasen

1
@ KamelMili: Предлагаю задать свой вопрос как вопрос , предоставив всю необходимую информацию. Комментарии не место. Вы всегда можете сослаться на этот ответ для контекста. И вы можете оставить комментарий со ссылкой на ваш связанный вопрос здесь (чтобы также привлечь мое внимание).
Эрвин Брандштеттер

16

Цитировать документацию :

Ключевые слова и идентификаторы без кавычек не чувствительны к регистру. Следовательно:

UPDATE MY_TABLE SET A = 5;

можно эквивалентно записать как:

uPDaTE my_TabLE SeT a = 5;

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

UPDATE "my_table" SET "a" = 5;

Заключение в кавычки идентификатора делает его чувствительным к регистру, тогда как имена без кавычек всегда свертываются в нижний регистр (в отличие от стандарта SQL, где имена без кавычек свертываются в верхний регистр). Например, идентификаторы FOO, fooи "foo"PostgreSQL считаются одинаковыми, но "Foo"и "FOO"отличаются от этих трех и друг друга.

Если вы хотите писать переносимые приложения, советуем всегда указывать конкретное имя или никогда не указывать его.


8

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


2
Это неверно в соответствии с объяснением, которое дал @ erwin-brandstetter
Майкл Сильвер,

9
Как это неверно? Если у вас есть имена столбцов со смешанным регистром или заглавными буквами, для того, чтобы ссылаться на них, вам нужно поместить идентификатор в двойные кавычки.
theferrit32
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.