Kann PostgreSQL eine Datenbank erstellen, bei der zwischen Groß- und Kleinschreibung unterschieden wird?

10

Ich portiere Code von einer Version von Sybase nach PostgreSQL. Dies ist eine C-Anwendung, die die Sybase-Clientbibliothek verwendet. Mein Ansatz ist es, eine Übersetzungsschicht zu schreiben, die Aufrufe dbsqlexec()an PQexec()(zum Beispiel) übersetzt. Dieser Teil funktioniert meistens.

Es scheint, dass die Sybase-Datenbank in Groß- und Kleinschreibung eingerichtet ist (in Bezug auf Datenbankobjektnamen). Zum Beispiel gibt es sowohl eine WIDGETTabelle als auch eine widgetTabelle. Es sieht so aus, als ob die Konvention in dieser Anwendung lautet, dass die Namen in Großbuchstaben die tatsächlichen Datentabellen angeben, während die Namen in Kleinbuchstaben als temporäre Tabellen verwendet werden, wenn eine Verarbeitung ausgeführt wird.

Nach 4.1 Lexical StructureSchlüsselwörter und Bezeichner ohne Anführungszeichen sind Groß- und Kleinschreibung. “ Ich weiß , dass ich zu deaktivieren automatischer Faltung Klein doppelten Anführungszeichen Bezeichner kann, aber ich will nicht haben , dass manuell durch die Myriaden von Linien von Code, der diese Datenbank verwendet.

Gibt es eine Möglichkeit, PostgreSQL so einzurichten, dass diese automatische Fallfaltung für Datenbankobjektkennungen deaktiviert wird?

Meine Alternative besteht darin, Code zu schreiben, der jede SQL-Anweisung untersucht und jeden Bezeichner in doppelte Anführungszeichen setzt (das ist kein Schlüsselwort).

Greg Hewgill
quelle
Schlüsselwörter können in doppelten Anführungszeichen als Bezeichner verwendet werden - auch wenn Sie dies nicht tun sollten. In jedem Fall können Sie nicht sicher sein, dass einige Bezeichner aus Ihrer Sybase-Codebasis keine Schlüsselwörter in PostgreSQL sind. Umso mehr Grund, Bezeichner in doppelte Anführungszeichen zu setzen oder diese vorzugsweise umzubenennen.
Erwin Brandstetter
Nicht zitierte Bezeichner in Postgres unterscheiden eigentlich überhaupt nicht zwischen Groß- und Kleinschreibung, sondern werden als Kleinbuchstaben behandelt. tAbLeNaMe stimmt also mit einer einzelnen Tabelle namens Tabellenname überein, nicht jedoch mit einer Tabelle namens Tabellenname. Ich würde die Tabellen umbenennen, weil sonst die Leute das "vergessen und versehentlich auf die Kleinbuchstaben-Version zugreifen.
JamesRyan
@ JamesRyan: Das ist falsch. select * from TaBlEnAmEverweist auf die gleiche Tabelle wie select * from tablenameoderselect * from TABLENAME
a_horse_with_no_name
@a_horse_with_no_name: Wenn Sie create table "tableName" (id integer primary key);und dann create table "tablename" (id integer primary key);diese Abfrage select * from TaBlEnAmE;aus "Tabellenname" und nicht aus "Tabellenname" auswählen. "Nicht zitierte Namen werden immer in Kleinbuchstaben gefaltet" .
Mike Sherrill 'Cat Recall'

Antworten:

3

Am Ende habe ich Code geschrieben, der das von der Anwendung generierte SQL in PostgreSQL-kompatibles SQL umwandelt. Es ist ziemlich einfach:

  • Teilen Sie die Anweisung in sinnvolle Token auf und überspringen Sie String-Literale in einfachen Anführungszeichen
  • Zitieren Sie alles, was kein Schlüsselwort oder keine Zahl ist

Ich habe diese Ebene auch genutzt, um Anrufe in isnullzu transformieren coalesce. Bisher funktioniert es ziemlich gut.

Greg Hewgill
quelle
Ich benutze Anführungszeichen ("blahblablah"), um die Groß- und Kleinschreibung zu berücksichtigen. Es funktioniert reibungslos für mich.
Anuj Patel
1

Gibt es eine Möglichkeit, PostgreSQL so einzurichten, dass diese automatische Fallfaltung für Datenbankobjektkennungen deaktiviert wird?

Nicht direkt. Möglicherweise können Sie den PostgreSQL-Quellcode relativ geringfügig ändern und neu kompilieren. (Beginnen Sie in src / backend / parser / parser.c?) Aber ich wäre überrascht, wenn es sehr einfach wäre.

Mike Sherrill 'Cat Recall'
quelle
Ich möchte lieber nicht mit dem Quellcode herumspielen, da dies eine benutzerdefinierte Änderung der PostgreSQL-Installation jedes Mal erfordern würde, wenn sich etwas ändert (Host, Version usw.) und binäre Installationen nicht verfügbar wären.
Greg Hewgill