Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Postgres Tabellennamen nichtz zu Kleinschreibung konvertieren

8 views
Skip to first unread message

Marc Santhoff

unread,
Mar 22, 2012, 12:50:08 PM3/22/12
to
Tag allerseits,

ich bin auf Fehlersuche und noch etwas wacklig im Umgang mit PostgreSQL,
deswegen meine Frage:

Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung aller
Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?

Ich bin nicht sicher, ob das Client-Programm hier was falsch macht, der
jdbc-Treiber verantwortlich ist oder der DB-Server nur "richtig
eingestellt" werden muß.

In der Doku zu 8.3 konnte ich bis jetzt nichts passendes finden.

Dankbar für zweckdienliche Hinweise,
Marc

Marc Santhoff

unread,
Mar 22, 2012, 1:21:26 PM3/22/12
to
Am Thu, 22 Mar 2012 16:50:08 +0000 schrieb Marc Santhoff:

> Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung aller
> Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?

Nein.

> Ich bin nicht sicher, ob das Client-Programm hier was falsch macht, der
> jdbc-Treiber verantwortlich ist oder der DB-Server nur "richtig
> eingestellt" werden muß.
>
> In der Doku zu 8.3 konnte ich bis jetzt nichts passendes finden.

Aber in den FAQ. Double quotes sind nötig, d.h. der Client macht was
falsch.

Ingrid^wMarc

Bernd Nawothnig

unread,
Mar 22, 2012, 4:25:07 PM3/22/12
to
On 2012-03-22, Marc Santhoff wrote:
> ich bin auf Fehlersuche und noch etwas wacklig im Umgang mit PostgreSQL,
> deswegen meine Frage:
>
> Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung aller
> Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?

Der SQL Standard schreibt vor, dass Bezeichner als case-insensitive zu
behandeln sind, und PostgreSQL hält sich lediglich daran. Dass das
intern auf durch ein lowercase realisiert wird, spielt in dem
Zusammenhang aber keine Rolle, das ist lediglich ein
Implementationsdetail.

Aber wie Du in Deinem eigenen Follow-Up ja bereits richtig erkannt
hast, kannst Du Namen durch Setzen in Double-Quotes (Backticks '`' in
MySQL und klammern in [] beim MS-SQL-Server) auch case-sensitive
machen, bzw. dann auch mit Leer- und Sonderzeichen, sowie Umlauten
anreichern.

MySQL + MyISAM, wo die Tabellennamen auch ohne Backticks einfach 1:1
auf Dateinamen gemappt sind, verhält sich unter einem case-sensitiven
Dateisystem, etwa unter Linux, nicht standardkonform (falls Du das von
daher gewohnt sein solltest).

> Ich bin nicht sicher, ob das Client-Programm hier was falsch macht, der
> jdbc-Treiber verantwortlich ist oder der DB-Server nur "richtig
> eingestellt" werden muß.

> In der Doku zu 8.3 konnte ich bis jetzt nichts passendes finden.

Bist Du auf diese alte Version angewiesen? Aktuell ist 9.1.



Bernd

--
"Die Antisemiten vergeben es den Juden nicht, dass die Juden Geist
haben - und Geld." [Friedrich Nietzsche]

Andreas Scherbaum

unread,
Mar 22, 2012, 4:42:26 PM3/22/12
to
Hallo,

Marc Santhoff <M.San...@t-online.de> wrote:
>
> ich bin auf Fehlersuche und noch etwas wacklig im Umgang mit PostgreSQL,
> deswegen meine Frage:
>
> Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung aller
> Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?
>
> Ich bin nicht sicher, ob das Client-Programm hier was falsch macht, der
> jdbc-Treiber verantwortlich ist oder der DB-Server nur "richtig
> eingestellt" werden muß.

Du kannst die Namen schreiben wie du willst, jede Schreibweise wird
erkannt. Wenn du unbedingt grpßgeschriebene Namen erzwingen willst,
dann setze alles in doppelte Anführungszeichen. Danach musst du aber
in wirklich jeder Anfrage die Bezeichner in Anführungszeichen setzen
und immer so schreiben wie die erstellt wurden.


Bis dann,

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Marc Santhoff

unread,
Mar 22, 2012, 6:59:50 PM3/22/12
to
Am Thu, 22 Mar 2012 21:25:07 +0100 schrieb Bernd Nawothnig:

> On 2012-03-22, Marc Santhoff wrote:

>> Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung aller
>> Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?
>
> Der SQL Standard schreibt vor, dass Bezeichner als case-insensitive zu
> behandeln sind, und PostgreSQL hält sich lediglich daran.

Aha, entscheidende Information und Argumentationshilfe.

> MySQL + MyISAM, wo die Tabellennamen auch ohne Backticks einfach 1:1 auf
> Dateinamen gemappt sind, verhält sich unter einem case-sensitiven
> Dateisystem, etwa unter Linux, nicht standardkonform (falls Du das von
> daher gewohnt sein solltest).

MySQL wird abgelöst.

>> In der Doku zu 8.3 konnte ich bis jetzt nichts passendes finden.
>
> Bist Du auf diese alte Version angewiesen? Aktuell ist 9.1.

Nö, war gerade greifbar, ist nur eine Testumgebung. Die echte DB bekomme
ich vorgesetzt.

Danke,
Marc

Marc Santhoff

unread,
Mar 22, 2012, 7:05:38 PM3/22/12
to
Am Thu, 22 Mar 2012 21:42:26 +0100 schrieb Andreas Scherbaum:

> Hallo,
>
> Marc Santhoff <M.San...@t-online.de> wrote:

>> Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung aller
>> Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?
>>
>> Ich bin nicht sicher, ob das Client-Programm hier was falsch macht, der
>> jdbc-Treiber verantwortlich ist oder der DB-Server nur "richtig
>> eingestellt" werden muß.

Btw. es war der Client, neuere Version kennt Quoting by default.

> Du kannst die Namen schreiben wie du willst, jede Schreibweise wird
> erkannt. Wenn du unbedingt grpßgeschriebene Namen erzwingen willst, dann
> setze alles in doppelte Anführungszeichen. Danach musst du aber in
> wirklich jeder Anfrage die Bezeichner in Anführungszeichen setzen und
> immer so schreiben wie die erstellt wurden.

Ja, folgenschwere Entscheidung, die treffe ich aber nicht. Die DB
existiert schon.

Zusatzfrage:

Wie bildet man bei "am besten" die Tabellennamen auf Anzeigenamen für den
benutzer ab? Eine Tabelle mit Zuordnungen und ggf. Sprache? Oder überläßt
man das dem Client-Programm?

Irgendwo hatte ich als Lösung mal gesehen, daß die Tabellenkommentare den
Anzeigenamen enthielten - hübsch, aber dann nur einsprachig. Und
womöglich in anderen DBen nicht möglich.

Danke,
Marc


Bernd Nawothnig

unread,
Mar 23, 2012, 3:54:23 AM3/23/12
to
On 2012-03-22, Marc Santhoff wrote:

>>> Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung aller
>>> Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?
>>>
>>> Ich bin nicht sicher, ob das Client-Programm hier was falsch macht, der
>>> jdbc-Treiber verantwortlich ist oder der DB-Server nur "richtig
>>> eingestellt" werden muß.
>
> Btw. es war der Client, neuere Version kennt Quoting by default.

Ist das auch abschaltbar? Ich halte festeingestelltes Quoting by
default für keine gute Lösung. Nebenbei löst das keine Konflikte, wenn
etwa Views oder Funktionen _in_ der Datenbank definiert sind. Das muss
dann auch alles händisch (nach)gequotet werden.

>> Du kannst die Namen schreiben wie du willst, jede Schreibweise wird
>> erkannt. Wenn du unbedingt grpßgeschriebene Namen erzwingen willst, dann
>> setze alles in doppelte Anführungszeichen. Danach musst du aber in
>> wirklich jeder Anfrage die Bezeichner in Anführungszeichen setzen und
>> immer so schreiben wie die erstellt wurden.
>
> Ja, folgenschwere Entscheidung, die treffe ich aber nicht. Die DB
> existiert schon.

Solange sich durch die case-insensitive und damit standardkonforme
Behandlung von Bezeichnern keine Konflikte ergeben (also etwa nicht
"Tabelle_1" neben "tabelle_1" bereits existiert): wo ist das Problem?
Dann könnte alles so bleiben, wie es ist. Und Standardkonformität
sollte immer erste Wahl sein.

> Zusatzfrage:
>
> Wie bildet man bei "am besten" die Tabellennamen auf Anzeigenamen für den
> benutzer ab? Eine Tabelle mit Zuordnungen und ggf. Sprache? Oder überläßt
> man das dem Client-Programm?

Solange es nur ein Clientprogramm gibt, ist es Geschmackssache.
Existieren aber mehrere Clientprogramme, dürfte die Implementation an
zentraler Stelle, also auf dem Datenbankserver zu bevorzugen sein. Die
muss man nämlich nur einmal anlegen.

Das alles ist aber, wenn man es robust und fehlertolerant machen will
(Unterscheidung zwischen de_DE und de_AT beispielsweise oder
Fallbacks, wenn bestimmte Sprachen nur unvollkommen eingepflegt sind),
keineswegs trivial. Ich habe das mal in PG so gemacht und bereue den
Aufwand im Nachhinein nicht.

> Irgendwo hatte ich als Lösung mal gesehen, daß die Tabellenkommentare den
> Anzeigenamen enthielten - hübsch, aber dann nur einsprachig. Und
> womöglich in anderen DBen nicht möglich.

Kommentare sollten schon echte Kommentare bleiben und nicht für
irgendwas anderes zweckentfremdet werden.

Stefan Froehlich

unread,
Mar 23, 2012, 4:09:24 AM3/23/12
to
On Thu, 22 Mar 2012 21:25:07 Bernd Nawothnig wrote:
> > Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung aller
> > Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?

> Der SQL Standard schreibt vor, dass Bezeichner als case-insensitive zu
> behandeln sind, und PostgreSQL hält sich lediglich daran.

Das ist gut und richtig. Nett waere es allerdings, wenn der Client auch
beim Autocomplete ein Mapping auf Kleinbuchstaben durchfuehren wuerde. Ich
schreibe z.B. zur eigenen geistigen Erleichterung Tabellennamen gerne in
CamelCase, diese werden dann aber nicht vervollstaendigt werden, obwohl das
prinzipiell einfach zu loesen waere.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Die Macht des Wissens, oder warum Stefan so behämmert schmatzt!
(Sloganizer)

Bernd Nawothnig

unread,
Mar 23, 2012, 5:35:42 AM3/23/12
to
On 2012-03-23, Stefan Froehlich wrote:
>> Der SQL Standard schreibt vor, dass Bezeichner als case-insensitive zu
>> behandeln sind, und PostgreSQL hält sich lediglich daran.
>
> Das ist gut und richtig. Nett waere es allerdings, wenn der Client auch
> beim Autocomplete ein Mapping auf Kleinbuchstaben durchfuehren wuerde. Ich
> schreibe z.B. zur eigenen geistigen Erleichterung Tabellennamen gerne in
> CamelCase, diese werden dann aber nicht vervollstaendigt werden, obwohl das
> prinzipiell einfach zu loesen waere.

Du meinst mit Client vermutlich psql? Schlag es den Entwicklern vor.
Ich halte den Vorschlag auch für sinnvoll.

Dazu lief auch gerade was ähnliches durch die Mailingliste. Und zwar
werden ja Schlüsselwörter auch bisher bereits autovervollständigt, und
zwar in Großbuchstaben, was aber natürlich prinzipiell nicht nötig
wäre, da die ebenfall case-insensitiv zu behandeln sind. Ein Patch
will sich nun an der Caseness (wie übersetzt man sowas elegant?) des
ersten eingegebenen Zeichens orientieren und entsprechend dem ersten
Zeichen autokomplettieren. Es gab allerdings Widerstand dagegen und
ich muss gestehen, mir gefällt die alte Lösung auch besser, weil sie
zu einem einheitlicheren Bild führt. Case-insensitiv hin,
case-insensitiv her, SQL-Schlüsselwörter werden nun mal üblicherweise
in Großbuchstaben geschrieben.

Stefan Froehlich

unread,
Mar 23, 2012, 5:59:04 AM3/23/12
to
On Fri, 23 Mar 2012 10:35:42 Bernd Nawothnig wrote:
> Du meinst mit Client vermutlich psql? Schlag es den Entwicklern vor.
> Ich halte den Vorschlag auch für sinnvoll.

Schauen wir einmal.

> [...] werden ja Schlüsselwörter auch bisher bereits autovervollständigt,
> [...]
> Case-insensitiv hin, case-insensitiv her, SQL-Schlüsselwörter werden nun
> mal üblicherweise in Großbuchstaben geschrieben.

Da bin ich relativ ambivalent - Hauptsache, es wird _ueberhaupt_
vervollstaendigt, unabhaengig vom case (gibt es dafuer eigentlich ein
einzelnes, deutsches Wort?) der bereits vorhandenen Buchstaben.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Tief und doch griffig?! Stefan - soviel, wie nur geht.
(Sloganizer)

Florian Weimer

unread,
Mar 23, 2012, 8:29:18 AM3/23/12
to
* Bernd Nawothnig:

> Der SQL Standard schreibt vor, dass Bezeichner als case-insensitive zu
> behandeln sind, und PostgreSQL hält sich lediglich daran.

Wobei der Standard wohl sagt, daß Bezeichner in "" sehr wohl
empfindlich gegen Kleinschreibung sind. PostgreSQL normalisiert
Bezeichner ohne "" zu Kleinbuchstaben, nicht Großbuchstaben, wie es
der Standard vorschreiben soll. Manche ORM-ähnlichen Werkzeuge mag das
verwirren.

Bernd Nawothnig

unread,
Mar 23, 2012, 9:03:02 AM3/23/12
to
On 2012-03-23, Stefan Froehlich wrote:
>> [...] werden ja Schlüsselwörter auch bisher bereits autovervollständigt,
>> [...]
>> Case-insensitiv hin, case-insensitiv her, SQL-Schlüsselwörter werden nun
>> mal üblicherweise in Großbuchstaben geschrieben.
>
> Da bin ich relativ ambivalent - Hauptsache, es wird _ueberhaupt_
> vervollstaendigt, unabhaengig vom case [...] der bereits vorhandenen
> Buchstaben.

Das wird es ja auch schon, halt bisher nur bei den Schlüsselwörtern
und dort grundsätzlich in Großbuchstaben. Ideal wäre Deine Ergänzung
für die Autokomplettierung von Bezeichnern, aber die dann halt zur
besseren optischen Unterscheidung grundsätzlich in Kleinbuchstaben
(meine Meinung). Ach so, es wurde auch der Vorschlag gemacht, die
Caseness dann konfigurierbar zu machen.

Wobei mir gerade einfällt, dass das Scoping schon Probleme schafft.
Nimm an, du fängst an zu tippen - woher soll der Autovervollständiger
wissen, ob du einen Schema-Namen oder einen durch den jeweils
aktuellen Suchpfad implizit definierten Tabellennamen meinst?

foo.bar vs. bar.foo vs. foo vs. bar

> (gibt es dafuer eigentlich ein einzelnes, deutsches Wort?)

Ist mir auch nicht bekannt.

Bernd Nawothnig

unread,
Mar 23, 2012, 9:06:16 AM3/23/12
to
On 2012-03-23, Florian Weimer wrote:

>> Der SQL Standard schreibt vor, dass Bezeichner als case-insensitive zu
>> behandeln sind, und PostgreSQL hält sich lediglich daran.

> Wobei der Standard wohl sagt, daß Bezeichner in "" sehr wohl
> empfindlich gegen Kleinschreibung sind.

Daran hält PosgreSQL sich ja auch. Aber dass es auch noch
standardkonform ist, war mir neu.

> PostgreSQL normalisiert Bezeichner ohne "" zu Kleinbuchstaben, nicht
> Großbuchstaben, wie es der Standard vorschreiben soll. Manche
> ORM-ähnlichen Werkzeuge mag das verwirren.

Das war mir auch neu, dass es selbst da eine Vorgabe durch den
Standard gibt.

Danke für die Erleuchtungen ;-)

Marc Santhoff

unread,
Mar 23, 2012, 10:55:25 AM3/23/12
to
Am Fri, 23 Mar 2012 08:54:23 +0100 schrieb Bernd Nawothnig:

> On 2012-03-22, Marc Santhoff wrote:
>
>>>> Gibt es ene Möglichkeit per Konfiguration die Zwangskonvertierung
>>>> aller Namen (Tabelle, Feld) in Kleinbuchstaben zu unterbinden?
>>>>
>>>> Ich bin nicht sicher, ob das Client-Programm hier was falsch macht,
>>>> der jdbc-Treiber verantwortlich ist oder der DB-Server nur "richtig
>>>> eingestellt" werden muß.
>>
>> Btw. es war der Client, neuere Version kennt Quoting by default.
>
> Ist das auch abschaltbar? Ich halte festeingestelltes Quoting by default
> für keine gute Lösung. Nebenbei löst das keine Konflikte, wenn etwa
> Views oder Funktionen _in_ der Datenbank definiert sind. Das muss dann
> auch alles händisch (nach)gequotet werden.

Selbstverständlich gibt es zu einem default-Wert auch abweichende andere.
Wär' ja auch zum schreien , wenn nicht. ;)

>> Zusatzfrage:
>>
>> Wie bildet man bei "am besten" die Tabellennamen auf Anzeigenamen für
>> den benutzer ab? Eine Tabelle mit Zuordnungen und ggf. Sprache? Oder
>> überläßt man das dem Client-Programm?
>
> Solange es nur ein Clientprogramm gibt, ist es Geschmackssache.
> Existieren aber mehrere Clientprogramme, dürfte die Implementation an
> zentraler Stelle, also auf dem Datenbankserver zu bevorzugen sein. Die
> muss man nämlich nur einmal anlegen.
>
> Das alles ist aber, wenn man es robust und fehlertolerant machen will
> (Unterscheidung zwischen de_DE und de_AT beispielsweise oder Fallbacks,
> wenn bestimmte Sprachen nur unvollkommen eingepflegt sind), keineswegs
> trivial. Ich habe das mal in PG so gemacht und bereue den Aufwand im
> Nachhinein nicht.

Das stelle ich mir auch so vor, insbesondere bei entfernten CLients und
dünnlichen Verbindungen, da kann die Startzeit schenll ein Problm werden.
Ggf. auch die zu übertragene DAtenmenge, wenn man die komplette
Lokalisierung in der DB machen will. Da würde man wohl um eine Art
Zwischenspeicherung und Aktualisierungsmodell nur bei Änderungen nicht
herum kommen...

>> Irgendwo hatte ich als Lösung mal gesehen, daß die Tabellenkommentare
>> den Anzeigenamen enthielten - hübsch, aber dann nur einsprachig. Und
>> womöglich in anderen DBen nicht möglich.
>
> Kommentare sollten schon echte Kommentare bleiben und nicht für
> irgendwas anderes zweckentfremdet werden.

Ich wüßte auch bessere Verwendungen dafür, fand es aber eine interessante
Idee.

Marc

Andreas Scherbaum

unread,
Mar 23, 2012, 10:17:43 AM3/23/12
to
Bernd Nawothnig <Bernd.N...@t-online.de> wrote:
>
> Wobei mir gerade einfällt, dass das Scoping schon Probleme schafft.
> Nimm an, du fängst an zu tippen - woher soll der Autovervollständiger
> wissen, ob du einen Schema-Namen oder einen durch den jeweils
> aktuellen Suchpfad implizit definierten Tabellennamen meinst?
>
> foo.bar vs. bar.foo vs. foo vs. bar

Oder ein weiteres Schlüsselwort der Datenbank.
Autovervollständigung funktioniert eigentlich nur einigermaßen wenn
man den kompletten Befehlssatz der Version kennt.

Andreas Scherbaum

unread,
Mar 23, 2012, 10:20:04 AM3/23/12
to
Wenn du in PostgreSQL die Bezeichner in "" setzt, dann bleiben die
auch so wie du sie schreibst. Das wiederum verwirrt den geneigten
Anwender wenn auf einmal die Tabelle "test" nicht mehr existiert,
weil sie als "Test" angelegt wurde ;-)

Ja, das Spiel sieht man ab und zu bei Frameworks, die pauschal erst
einmal alles quoten. In der Applikation macht man sich keine Gedanken
sondern schreibt einfacht "Test". In der Datenbank in psql später muss
es dann auch in "" stehen, einfach nur den Tabellennamen hinschreiben
klappt dann nicht mehr.
0 new messages