我为之编写软件的产品之一就是记账类应用程序。它是用C++编写的,使用C++ Builder和VCL控件,连接到运行在Linux上的PostgreSQL数据库。
PostgreSQL数据库当前的版本为8.4.x。我们使用UTF8编码。每件事都运行得很好。
我们正在使用完全相同的编码在PostgreSQL v9.2.3上运行我们的软件测试,并发现了一个问题,在这个问题中,我们所有的文本编辑输入都用\r\n字符替换了多行。
例如,你输入3行文本,在每行后按enter键,然后保存并重新阅读,我得到一行,但行尾字符被删除。当我们从数据库获取数据时,我们以一行结束: line1\r\nline2\r\nline3\r\n,其中显示"\r\n“,而不是在流中获取0x0A,0x0D。
我们的应用程序不支持Unicode。波兰德的AnsiString(在迁移此应用程序的过程中。到C++生成器XE)。有没有人知道这可能是什么原因,或者提供一些东西来尝试在当前代码库中修复这个问题,而更大的转换正在进行中?
我尝试过Borland的DBText和DBRichText控件,它们做的都是一样的事情。
我应该提到的另一点是,我们只在服务器上针对新的PostgreSQL进行了测试,并且仍然使用8.x PostgreSQL客户端库(psql.lib)。因此,客户端和服务器版本并不完全在同一级别,但我并不怀疑这是一个问题,但任何见解都是受欢迎的。
更新:
以下是两个版本的PostgreSQL的一些命令行结果。
版本9.2.3 testdb=# select * from notes where oid=5146352;docid | docno | username | created | followup | reminder | subject | comments
-------+----------+----------+-------------------------------+----------+----------+-----------+- 3001 | 11579522 | eric | 2013-02-15 22:38:24.136517+00 |f|f|测试说明|line1 1\r\nline3 2\r\nline3 3\r\n
版本8.4.8 testdb=# select * from notes where oid=16490575;文档|文档编号|用户名|已创建|关注|提醒|主题|评论-------+----------+----------+------------------------------+----------+----------+-+- 3001 | 11579522 | eric | 2013-02-18 20:15:23.10943-05 |f| <> |line2 1\r:line2 2\r:line3 3\r:
不知道如何格式化它,但是在8.4.8命令行输出中,我在屏幕上打印了3行新行,其中9.2.3版本连接了输出。
这两个数据库的insert是同一个客户端。所以PostgreSQL处理换行符的方式发生了一些变化,我想知道是否有一个配置设置来恢复旧的行为,或者我可以在我的select语句中做些什么来恢复旧的行为。
发布于 2013-02-19 09:54:48
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_strings到on,因为这是前进的方向。
发布于 2013-02-19 10:28:53
您的问题看起来与postgres配置变量standard_conforming_strings有关。在Postgres 9.1之前,这在默认情况下是关闭的。这就是为什么postgres不从字面上处理反斜杠而是解释它们的原因。但是根据SQL标准,反斜杠应该按字面意思处理。因此,从Postgres9.1开始,这个配置变量已经打开,您可以看到\r\n是文字而不是解释。
虽然这不是正确的方法,但要使其在您的情况下工作,您需要编辑服务器的配置文件(postgresql.conf)并关闭此设置(standard_conforming_strings=on)
https://stackoverflow.com/questions/14939305
复制相似问题