Чи може PostgreSQL створити базу даних, що враховує регістри?


10

Я переношу якийсь код з якоїсь версії Sybase до PostgreSQL. Це програма C, яка використовує клієнтську бібліотеку Sybase. Мій підхід полягає в тому, щоб написати шар перекладу, який переводить дзвінки dbsqlexec()в PQexec()(наприклад). Ця частина в основному працює.

Здається, що база даних Sybase створена в залежності від регістру (стосовно імен об'єктів бази даних). Наприклад, є і WIDGETстіл, і widgetстіл. Схоже, умова в цій програмі полягає в тому, що великі імена вказують на фактичні таблиці даних, тоді як малі імена використовуються як тимчасові таблиці при виконанні деякої обробки.

Згідно з 4.1 Лексичною структурою , " Ключові слова та котируються ідентифікатори нечутливі до регістру ". Я знаю, що можу подвоїти цитування ідентифікаторів, щоб відключити автоматичне складання в малі регістри, але мені не хочеться робити це вручну через мільйони рядків коду, який використовує цю базу даних.

Чи є спосіб встановити PostgreSQL для відключення цього автоматичного складання корпусу для ідентифікаторів об'єктів бази даних?

Моєю альтернативою буде написання коду, який вивчає кожен оператор SQL і ставить подвійні лапки навколо кожного ідентифікатора (це не ключове слово).


Ключові слова можуть бути використані як ідентифікатори, якщо їх двічі цитувати, навіть якщо ви цього не повинні робити. У будь-якому випадку, ви не можете бути впевнені, що деякі ідентифікатори з вашої бази коду Sybase не є ключовими словами в PostgreSQL. Тим більше, що потрібно подвійно цитувати ідентифікатори або, бажано, перейменувати їх.
Ервін Брандстетер

ідентифікатори без котирування в постгресах насправді взагалі не чутливі до регістру, вони розглядаються як усі нижчі регістри. тому 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". Msgstr "Імена без котирування завжди складаються в малі регістри" .
Майк Шеррілл 'Відкликання котів'

Відповіді:


3

Я закінчив написати деякий код, який перетворює SQL, що генерується програмою, у сумісний з PostgreSQL SQL. Це досить просто:

  • Розділіть заяву на чутливі лексеми, пропускаючи одноцитовані рядкові букви
  • Подвійне цитування всього, що не є ключовим словом чи цифрою

Я також скористався цим шаром для перетворення викликів isnullу coalesce. Поки що це працює досить добре.


Я використовую котирування ("блахблабла"), щоб зробити це чутливим до регістру .. для мене це працює гладко ...
Ануй Патель

1

Чи є спосіб встановити PostgreSQL для відключення цього автоматичного складання корпусу для ідентифікаторів об'єктів бази даних?

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


Я вважаю за краще не возитися з вихідним кодом, оскільки це вимагатиме користувацької зміни установки PostgreSQL кожного разу, коли щось змінюється (хост, версія тощо), а двійкові установки не будуть доступні.
Грег Хьюгілл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.