Может ли PostgreSQL создать базу данных с учетом регистра?

10

Я портирую код из какой-то версии Sybase на PostgreSQL. Это приложение C, которое использует клиентскую библиотеку Sybase. Мой подход заключается в написании перевода слоя , который переводит вызовы dbsqlexec()в PQexec()(например). Эта часть в основном работает.

Похоже, что база данных Sybase настроена с учетом регистра (в отношении имен объектов базы данных). Например, есть и WIDGETтаблица, и widgetтаблица. Похоже, что соглашение в этом приложении заключается в том, что имена в верхнем регистре указывают на действительные таблицы данных, а имена в нижнем регистре используются в качестве временных таблиц при выполнении некоторой обработки.

Согласно лексической структуре 4.1 « Ключевые слова и идентификаторы без кавычек не чувствительны к регистру». Я знаю, что могу использовать двойные кавычки для идентификаторов, чтобы отключить автоматическое свертывание в нижний регистр, но я не хочу делать это вручную через миллионы строк кода, который использует эту базу данных.

Есть ли способ настроить PostgreSQL, чтобы отключить это автоматическое сворачивание регистра для идентификаторов объектов базы данных?

Моя альтернатива - написать код, который проверяет каждое выражение SQL и помещает двойные кавычки вокруг каждого идентификатора (это не ключевое слово).

Грег Хьюгилл
источник
Ключевые слова могут использоваться в качестве идентификаторов, если они заключены в двойные кавычки - даже если вы не должны этого делать. В любом случае, вы не можете быть уверены, что некоторые идентификаторы из вашей базы кода Sybase не являются ключевыми словами в PostgreSQL. Все больше оснований заключать в кавычки идентификаторы или, желательно, их переименовывать.
Эрвин Брандштеттер
идентификаторы без кавычек в postgres на самом деле вообще не чувствительны к регистру, они рассматриваются как все строчные. поэтому tAbLeNaMe будет соответствовать одной таблице с именем tablename, но не одной таблице с именем tableName. Я бы переименовал таблицы, потому что иначе люди забудут "и в итоге получат доступ к строчной версии по ошибке.
JamesRyan
@JamesRyan: это неправильно. select * from TaBlEnAmEбудет ссылаться на ту же таблицу, что select * from tablenameиselect * from TABLENAME
a_horse_with_no_name
@a_horse_with_no_name: Если вы create table "tableName" (id integer primary key);, а затем, create table "tablename" (id integer primary key);то этот запрос select * from TaBlEnAmE;будет выбираться из «tablename», а не из «tableName». «Имена без кавычек всегда складываются в нижний регистр» .
Майк Шеррилл 'Cat Recall'

Ответы:

3

Я закончил тем, что написал некоторый код, преобразующий SQL, сгенерированный приложением, в PostgreSQL-совместимый SQL. Это довольно просто:

  • Разделите оператор на разумные токены, пропуская строковые литералы в одинарных кавычках
  • Двойная кавычка всего, что не является ключевым словом или числом

Я также воспользовался этим уровнем для преобразования вызовов isnullв coalesce. Пока это работает довольно хорошо.

Грег Хьюгилл
источник
я использую кавычки ("blahblablah"), чтобы сделать его чувствительным к регистру .. это работает гладко для меня ..
Anuj Patel
1

Есть ли способ настроить PostgreSQL, чтобы отключить это автоматическое сворачивание регистра для идентификаторов объектов базы данных?

Не напрямую. Вы можете внести относительно небольшие изменения в исходный код PostgreSQL и перекомпилировать его. (Начните с src / backend / parser / parser.c?) Но я был бы удивлен, если бы это было очень просто.

Майк Шеррилл 'Cat Recall'
источник
Я бы предпочел не связываться с исходным кодом, так как это потребовало бы пользовательского изменения установки PostgreSQL каждый раз, когда что-либо изменялось (хост, версия и т. Д.), И двоичные установки были бы недоступны.
Грег Хьюгилл