PostgreSQLは大文字と小文字を区別するデータベースを作成できますか?


10

一部のコードを一部のバージョンのSybaseからPostgreSQLに移植しています。これは、Sybaseクライアントライブラリを使用するCアプリケーションです。私のアプローチは、呼び出しdbsqlexec()PQexec()(たとえば)に変換する変換レイヤーを記述することです。その部分はほとんど機能しています。

Sybaseデータベースは、(データベースオブジェクト名に関して)大文字と小文字を区別する方法で設定されているようです。たとえば、WIDGETテーブルとテーブルの両方がありwidgetます。このアプリケーションの規則は、すべて大文字の名前が実際のデータテーブルを示し、小文字の名前は処理を実行するときに一時テーブルとして使用されるようです。

4.1字句構造によると、「キーワードと引用符で囲まれていない識別子は大文字と小文字が区別されません。」識別子を二重引用符で囲んで小文字への自動折りたたみを無効にできることはわかっていますが、何十億行にもわたって手動で行う必要はありませんこのデータベースを使用するコードの。

データベースオブジェクト識別子のこの自動大文字小文字変換を無効にするようにPostgreSQLを設定する方法はありますか?

私の代替案は、各SQLステートメントを調べ、すべての識別子(キーワードではない)を二重引用符で囲むコードを記述することです。


二重引用符で囲んだ場合、キーワード識別子として使用できます。いずれにせよ、Sybaseコードベースの一部の識別子がPostgreSQLのキーワードではないことは確信できません。識別子を二重引用するか、できればそれらの名前を変更する理由はなおさらです。
Erwin Brandstetter、2012年

postgres内の引用符で囲まれていない識別子は、実際にはまったく大文字と小文字が区別されず、すべて小文字として扱われます。そのため、tAbLeNaMeはtablenameと呼ばれる単一のテーブルと一致しますが、tableNameと呼ばれるテーブルとは一致しません。それ以外の人は忘れて」と誤って小文字のバージョンにアクセスすることになりますので、私はテーブルの名前を変更します。
JamesRyan

@JamesRyan:それは間違っています。or select * from TaBlEnAmEと同じテーブルを参照しますselect * from tablenameselect * 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の」から「テーブル名」から選択します。「引用符で囲まれていない名前は常に小文字に変換されます」
マイクシェリル「キャットリコール」

回答:


3

最終的に、アプリケーションによって生成されたSQLをPostgreSQL互換のSQLに変換するコードをいくつか作成しました。とても簡単です:

  • ステートメントを適切なトークンに分割し、単一引用符で囲まれた文字列リテラルをスキップします
  • キーワードまたは数値以外のすべてを二重引用符で囲む

また、このレイヤーを利用してへの呼び出しを変換しisnullましたcoalesce。これまでのところ、かなりうまく機能しています。


引用符( "blahblablah")を使用して、大文字と小文字を区別します。スムーズに動作します
。– Anuj Patel 2012

1

データベースオブジェクト識別子のこの自動大文字小文字変換を無効にするようにPostgreSQLを設定する方法はありますか?

直接ではありません。あなたはありますが比較的軽微な変更行うことができるよう、PostgreSQLのソースコードを、それを再コンパイルします。(src / backend / parser / parser.cで開始しますか?)しかし、それが非常に単純であるならば、私は驚かれることでしょう。


私はソースコードをいじらないでください。変更すると、ホスト(バージョンなど)が変更されるたびにPostgreSQLのインストールにカスタム変更が必要になり、バイナリインストールが利用できなくなります。
Greg Hewgill、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.