2013-02-18 118 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