Configuration

PostgreSQL 9.3 - postgresql.conf 中的standard_confirming_strings 選項不影響遠端機器

  • June 3, 2014

我正在更新一個與 postgreSQL 9.3 數據庫通信的工作程序。我需要在 postgresql.conf 文件中關閉一個名為 standard_conforming_strings 的選項,以便可以在數據庫中正確儲存反斜杠。

在安裝過程中,我在伺服器機器上自動關閉了 postgresql.conf 中的 standard_conforming_strings 選項。但是,該程序的客戶端安裝僅包含指向伺服器電腦上的執行檔的快捷方式。客戶端機器根本沒有安裝 postgres。

如果包含反斜杠的數據儲存在伺服器電腦上,則數據會正確保存,這意味著 standard_conforming_strings 選項已成功關閉。但是,從客戶端電腦保存資訊時,反斜杠儲存不正確(作為 ‘\134’ 而不是 ‘')。

只有伺服器機器安裝了 postgres,所以它是唯一帶有 postgresql.conf 文件的機器,可以打開或關閉 standard_conforming_strings 選項。我知道這個選項在伺服器機器上被正確禁用,但由於某種原因,當數據保存在客戶端機器上時,反斜杠沒有正確保存,即使數據被保存到同一個數據庫。

如果這兩台電腦都保存到同一個數據庫,它們應該引用同一個 postgresql.conf 文件,不是嗎?數據應該以相同的方式儲存在兩台機器上。這裡出了什麼問題?

任何幫助或建議將不勝感激!

**編輯:**根據要求,我在 postgres 上啟用了語句的日誌記錄,當我嘗試保存包含反斜杠的數據時,這就是日誌文件中顯示的內容:

2014-06-02 13:44:01 PDT LOG:  statement: SELECT * FROM tblapp;
2014-06-02 13:44:38 PDT WARNING:  nonstandard use of escape in a string literal at character 135
2014-06-02 13:44:38 PDT HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
2014-06-02 13:44:38 PDT LOG:  statement: BEGIN;DELETE FROM tblapp WHERE app_key='ClientApp_ArchivePath';INSERT INTO tblapp (app_key,app_value) VALUES ('ClientApp_ArchivePath','C:\134Users\134Stephane\134Documents\134Archive');
2014-06-02 13:44:38 PDT LOG:  statement: COMMIT

數據在 pgAdmin 中顯示如下:

ClientApp_ArchivePath | C:\Users\Stephane\Documents\Archive

**注意:**我在正確保存反斜杠的機器上執行此操作。我目前無法訪問錯誤保存它們的機器,但希望我能盡快完成相同的過程並在此處發布結果。

所以實際上是我的應用程序在轉義字元。該程序的舊版本使用 postgres 8.0 執行,它需要轉義字元,但 postgres 9.3 可以使用非轉義字元。

我更改了我的應用程序,使其不再轉義字元,刪除了對 postgres.conf 中的 standard_conforming_string 設置的任何引用,瞧!

我正在更新一個與 postgreSQL 9.3 數據庫通信的工作程序。我需要在 postgresql.conf 文件中關閉一個名為 standard_conforming_strings 的選項,以便可以在數據庫中正確儲存反斜杠。

這兩件事是完全無關的。您可能想要更改設置,但您不需要“正確儲存反斜杠”。我強烈建議您不要更改-standard_conforming_strings這是一個向後兼容性設置,將來某個時候將從 PostgreSQL 中刪除。不僅如此,最好盡可能遵循標準。

啟用後,standard_conforming_strings您可以像儲存其他任何內容一樣儲存反斜杠:

CREATE TABLE x(blah text);

SET standard_conforming_strings = on;

INSERT INTO x(blah) VALUES ('back\slash');

SELECT blah FROM x;

會產生back\slash.

如果standard_conforming_strings關閉,則必須編寫'back\slash'才能獲得相同的效果。E''字元串也是如此: E'back\slash'.

在安裝過程中,我在伺服器機器上自動關閉了 postgresql.conf 中的 standard_conforming_strings 選項。但是,該程序的客戶端安裝僅包含指向伺服器電腦上的執行檔的快捷方式。客戶端機器根本沒有安裝 postgres。

standard_conforming_strings是伺服器端設置。它也可以由客戶端分配,但通常不是,預設設置為伺服器端。

你不需要惹客戶。

如果包含反斜杠的數據儲存在伺服器電腦上,則數據會正確保存,這意味著 standard_conforming_strings 選項已成功關閉。

同樣,您的第一個陳述根本不會導致第二個陳述。你的假設是無效的。

但是,從客戶端電腦保存資訊時,反斜杠儲存不正確(作為 ‘\134’ 而不是 ‘')。

根據什麼客戶?顯示實際的 SQL,提供有關客戶端應用程序的資訊,顯示表的 DDL 等。

standard_conforming_strings如果您對會話的值有疑問,請使用SHOW standard_conforming_strings查看設置。

引用自:https://dba.stackexchange.com/questions/65427