1

私がソフトウェアを作成する製品の 1 つは、会計タイプのアプリケーションです。C++ で記述され、C++ Builder と VCL コントロールを使用し、Linux で実行されている PostgreSQL データベースに接続します。

PostgreSQL データベースは現在、バージョン 8.4.x です。UTF8エンコーディングを使用しています。すべてがかなりうまく機能します。

まったく同じエンコーディングを使用して PostgreSQL v9.2.3 に対してソフトウェアのテストを実行しており、すべてのテキスト編集入力が複数の行を \r\n 文字に置き換えているという問題を発見しています。

たとえば、3行のテキストを入力し、各行の後にEnterキーを押してから保存して読み返すと、行末文字が削除された1行が得られます。データベースからデータを取得すると、最終的に次のような 1 行になります。

私たちのアプリケーションは Unicode に対応していません。Borland の AnsiString。(このアプリを C++ Builder XE に移行中)。誰かがこれを引き起こしている可能性があることを知っていますか、または大規模な変換が進行している間に現在のコードベースでこれを修正しようとするものを提供していますか?

Borland DBText および DBRichText コントロールを試しましたが、どちらも同じことを行います。

言及すべきもう 1 つのポイントは、サーバー上の新しい PostgreSQL に対してのみテストし、8.x PostgreSQL クライアント ライブラリ (psql.lib) をまだ使用していることです。したがって、クライアントとサーバーのバージョンはまったく同じレベルではありませんが、これが問題であるとは思いませんが、洞察は大歓迎です.

アップデート:

以下は、2 つのバージョンの PostgreSQL からのコマンド ラインの結果です。

バージョン 9.2.3 testdb=# select * from notes where oid=5146352; ドシッド | ドクノ | ユーザー名 | 作成 | フォローアップ | リマインダー | 件名 | コメント
-------+----------+----------+------------------- ------------+---------+----------+-----------+--- -------------------------- 3001 | 11579522 | エリック | 2013-02-15 22:38:24.136517+00 | ふ | ふ | テストノート | ライン1\r\nライン2\r\nライン3\r\n

バージョン 8.4.8 testdb=# select * from notes where oid=16490575; ドシッド | ドクノ | ユーザー名 | 作成 | フォローアップ | リマインダー | 件名 | コメント -------+----------+----------+------------------- -----------+----------+----------+--------------+- --------- 3001 | 11579522 | エリック | 2013-02-18 20:15:23.10943-05 | ふ | ふ | <> | ライン 1\r : ライン 2\r : ライン 3\r :

これを SO 用にフォーマットする方法がわかりませんが、8.4.8 コマンド ライン出力では、9.2.3 バージョンでは出力が連結されるため、画面に 3 つの新しい行が出力されます。

両方のデータベースの挿入は同じクライアントです。そのため、PostgreSQL が改行文字を処理する方法が変更されました。古い動作を元に戻す構成設定があるかどうか、または古い動作を元に戻すために select ステートメント内で実行できる何かがあるかどうか疑問に思っています。

4

2 に答える 2

1

8.4 にはデフォルトでstandard_conforming_stringsが設定さoffれており、9.2 にはデフォルトで設定されていonます。

の場合off、リテラル文字列で'\n'は、C 言語のように改行を意味しますが、のon場合は、バックスラッシュ文字の後に文字が続くことを意味しますn

8.4 の動作に戻すにはSET standard_conforming_strings=off、セッション内で発行するか、

ALTER DATABASE yourdb SET standard_conforming_strings=off;

それが持続し、このデータベースへの新しい接続のデフォルトになるようにします。

長期的には、コードを適応させて対処することをお勧めしますstandard_conforming_stringsonこれが前進する方法だからです。

于 2013-02-19T01:54:47.983 に答える
1

あなたの問題は postgres config variable と関係があるようですstandard_conforming_strings。Postgres 9.1 より前では、これはデフォルトでオフになっていました。これが、postgres がバックスラッシュを文字どおりに扱わずに解釈した理由です。しかし、SQL 標準によれば、バックスラッシュは文字どおりに扱われるべきです。そのため、postgres 9.1 から、この構成変数がオンになり\r\n、解釈ではなくリテラルとして表示されます。

これは正しいアプローチではありませんが、あなたのケースで機能させるには、サーバーの構成ファイル (postgresql.conf) を編集して、この設定をオフにする必要があります ( standard_conforming_strings=on) 。

于 2013-02-19T02:28:53.253 に答える