PostgreSQL 9.3 - postgresql.conf 中的standard_confirming_strings 選項不影響遠端機器
我正在更新一個與 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
查看設置。