PostgreSQL può creare un database con distinzione tra maiuscole e minuscole?


10

Sto portando un po 'di codice da una versione di Sybase a PostgreSQL. Questa è un'applicazione C che utilizza la libreria client Sybase. Il mio approccio è quello di scrivere un livello di traduzione che traduca le chiamate dbsqlexec()a PQexec()(ad esempio). Quella parte funziona principalmente.

Sembra che il database Sybase sia impostato con distinzione tra maiuscole e minuscole (rispetto ai nomi degli oggetti del database). Ad esempio, c'è sia una WIDGETtabella che una widgettabella. Sembra che la convenzione in questa applicazione sia che i nomi in maiuscolo indicano le tabelle dei dati effettivi, mentre i nomi in minuscolo vengono utilizzati come tabelle temporanee quando si esegue l'elaborazione.

Secondo la Struttura lessicale 4.1 , " Le parole chiave e gli identificatori non quotati non fanno distinzione tra maiuscole e minuscole " . So che posso raddoppiare gli identificatori per disabilitare il pieghevole automatico in minuscolo, ma non voglio farlo manualmente attraverso i miliardi di righe di codice che utilizza questo database.

Esiste un modo per impostare PostgreSQL per disabilitare la piegatura automatica di maiuscole e minuscole per gli identificatori di oggetti del database?

La mia alternativa sarà quella di scrivere del codice che esamina ogni istruzione SQL e mette virgolette doppie attorno a ogni identificatore (che non è una parola chiave).


Le parole chiave possono essere utilizzate come identificatori se racchiuse tra virgolette doppie, anche se non dovresti farlo. In ogni caso, non puoi essere sicuro che alcuni identificatori della tua base di codice Sybase non siano parole chiave in PostgreSQL. Un motivo in più per citare due volte gli identificativi o, preferibilmente, rinominarli.
Erwin Brandstetter,

gli identificatori non quotati in Postgres in realtà non fanno distinzione tra maiuscole e minuscole, sono trattati come minuscoli. quindi tAbLeNaMe corrisponderà a una singola tabella denominata tablename ma non a una denominata tableName. Vorrei rinominare le tabelle perché altrimenti la gente dimenticherà "e finirà per accedere alla versione minuscola per errore.
JamesRyan,

@JamesRyan: è sbagliato. select * from TaBlEnAmEfarà riferimento alla stessa tabella di select * from tablenameoselect * from TABLENAME
a_horse_with_no_name del

@a_horse_with_no_name: se tu create table "tableName" (id integer primary key);, e quindi create table "tablename" (id integer primary key);questa query select * from TaBlEnAmE;selezionerà da "tablename", non da "tableName". "I nomi non quotati vengono sempre piegati in minuscolo" .
Mike Sherrill "Cat Recall",

Risposte:


3

Ho finito per scrivere del codice che trasforma l'SQL generato dall'applicazione in SQL compatibile PostgreSQL. È abbastanza semplice:

  • Dividi l'istruzione in token sensibili, saltando letterali stringa a virgoletta singola
  • Cita due volte tutto ciò che non è una parola chiave o un numero

Ho anche approfittato di questo livello per trasformare le chiamate isnullin coalesce. Finora funziona abbastanza bene.


uso le virgolette ("blahblablah") per renderlo sensibile al maiuscolo / minuscolo .. per me funziona senza problemi ..
Anuj Patel

1

Esiste un modo per impostare PostgreSQL per disabilitare la piegatura automatica di maiuscole e minuscole per gli identificatori di oggetti del database?

Non direttamente Si potrebbe essere in grado di apportare una modifica relativamente minore per il codice sorgente di PostgreSQL , e ricompilarlo. (Inizia in src / backend / parser / parser.c?) Ma sarei sorpreso se fosse molto semplice.


Preferirei non scherzare con il codice sorgente, poiché ciò richiederebbe una modifica personalizzata all'installazione PostgreSQL ogni volta che qualcosa cambiava (host, versione, ecc.) E le installazioni binarie non sarebbero disponibili.
Greg Hewgill,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.