1

我编写软件的产品之一是会计类型的应用程序。它是用 C++ 编写的,使用 C++ Builder 和 VCL 控件,连接到在 Linux 上运行的 PostgreSQL 数据库。

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)。所以客户端和服务器版本并不完全在同一级别,但我不怀疑这是一个问题,但任何见解当然欢迎。

更新:

以下是 PostgreSQL 两个版本的一些命令行结果。

版本 9.2.3 testdb=# select * from notes where oid=5146352; 顺从 | 文档 | 用户名 | 创建 | 跟进 | 提醒 | 主题 | 评论
-------+----------+----------+------- ------------+---------+----------+-----------+--- -------------------------- 3001 | 11579522 | 埃里克 | 2013-02-15 22:38:24.136517+00 | f | f | 测试笔记 | 第 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 | f | f | <> | line1\r : line2\r : line3\r :

不知道如何为 SO 格式化,但在 8.4.8 命令行输出中,我在屏幕上打印了 3 行新行,因为 9.2.3 版本连接了输出。

两个数据库的插入是同一个客户端。所以 PostgreSQL 处理换行符的方式发生了一些变化,我想知道是否有一个配置设置来恢复旧的行为,或者我可以在我的 select 语句中做些什么来恢复旧的行为。

4

2 回答 2

1

8.4默认设置为standard_conforming_stringsoff,9.2on默认设置。

当 it'soff在文字字符串中时,'\n'表示 C 语言中的换行符,而当 it's 时on,它表示后跟字符的反斜杠字符n

要回到 8.4 的行为,您可以SET standard_conforming_strings=off在会话中发出或

ALTER DATABASE yourdb SET standard_conforming_strings=off;

使其持久存在并成为与该数据库的新连接的默认值。

从长远来看,建议调整您的代码以应对,standard_conforming_strings因为on这是前进的方向。

于 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 回答