2013-02-18 117 views
1

我爲軟件編寫的產品之一是會計類型應用程序。它用C++編寫,使用C++ Builder和VCL控件,連接到運行在Linux上的PostgreSQL數據庫。PostgreSQL VCL控件

PostgreSQL數據庫目前版本爲8.4.x.我們使用UTF8編碼。一切工作都很好。

我們正在運行我們對PostgreSQL的v9.2.3具有完全相同的編碼軟件的測試,發現在我們所有的文本編輯輸入與\ r \ n個字符替換多行的問題。

因此,例如,您輸入3行文本,並在每行後按回車鍵,然後保存並讀回,我得到一行刪除行結束字符。當我們從數據庫中獲取數據時,我們會看到如下一行:line1 \ r \ nline2 \ r \ nline3 \ r \ n顯示「\ r \ n」而不是在流中獲取0x0A,0x0D。

我們的應用程序不支持Unicode。 Borland的AnsiString。 (在將此應用程序遷移到C++ Builder XE的過程中)。有誰知道什麼可能會導致這種情況,或提供一些事情來嘗試解決這個問題在當前的代碼庫,而更大的轉換正在進行?

我試過Borland DBText和DBRichText控件,它們都做同樣的事情。

的另一點,我應該提到的是,我們只對服務器上的新的PostgreSQL測試,並且依然採用了8.x的PostgreSQL客戶端庫(psql.lib)。所以客戶端和服務器版本不完全在同一水平,但我不認爲這是一個問題,但任何洞察力當然歡迎。

UPDATE:

以下是PostgreSQL的兩個版本的一些命令行的結果。

版9.2.3 TESTDB =#SELECT * FROM筆記其中OID = 5146352; docid | docno |用戶名|創建|跟進|提醒|主題|評論
------- + ---------- + ---------- + ----------------- -------------- + ---------- + ---------- + ----------- + - ---------------------------- 3001 | 11579522 | eric | 2013-02-15 22:38:24.136517 + 00 | f | f |測試筆記| line1 \ r \ nline2 \ r \ nline3 \ r \ n

版本8.4.8 testdb =#select * from notes where oid = 16490575; docid | docno |用戶名|創建|跟進|提醒|主題|評論 ------- + ---------- + ---------- + ------------------ ------------ + ---------- + ---------- + -------------- + ---------- 3001 | 11579522 | eric | 2013-02-18 20:15:23.10943-05 | f | f | <> | LINE1 \ r :LINE2 \ r :line3中\ r :

不知道如何格式化此爲SO,但在8.4.8命令行輸出,我已經打印在屏幕上3條新線路,其中作爲9.2.3版本連接輸出。

這兩個數據庫的插入是相同的客戶端。所以PostgreSQL處理新行字符的方式發生了變化,我想知道是否有一個配置設置來恢復舊行爲,或者在我的select語句中可以執行的操作來恢復舊行爲。

回答

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,因爲這是前進的方向。

+0

謝謝你的建議,但這似乎沒有工作。看起來這也是正確的參數,但是,唉,它似乎沒有引起任何明顯的差異。可以肯定的是,我運行了這個查詢:從docid ='3001'和docno ='11579522'的註釋中選擇長度(註釋);我得到了27個結果,其中包含'\','r','\','n'個字符。 – Eric 2013-02-20 01:08:25

+0

更改後插入這些註釋的位置?如果不是這個原因 – 2013-02-20 06:56:28

+0

是的,他們是。我正在測試一個測試數據庫。我對postgresql.conf進行了更改並重新啓動了數據庫服務器(在Linux上運行)。我刪除了文本並重新輸入。我也確認輸入的字符串是「line1 0x0a 0x0d line2 0x0a 0x0d」,當我讀回來時,我得到了「line1 \ r \ nline2 \ r \ n」而不是line1和line2,小數值10和13. – Eric 2013-02-20 12:34:14

1

你的問題看起來像是與postgres配置變量standard_conforming_strings。在Postgres 9.1之前,這是默認關閉的。這就是爲什麼Postgres沒有直接處理反斜槓,而是解釋它們。但是根據SQL標準,反斜槓應該從字面上處理。所以,從postgres 9.1開始,這個配置變量已經打開,你看到你的\r\n作爲文字而不是解釋。

雖然這不是我正確的方法,使其工作你的情況,你需要編輯服務器的配置文件(postgresql.conf中),並關閉此設置(standard_conforming_strings=on

+0

看到我對丹尼爾的回覆。這看起來很有希望,但似乎沒有改變任何東西。 – Eric 2013-02-20 01:09:21