从PL/SQL Developer 中复制查询结果到文本文件中,查询结果本身看不到双引号和换行。但奇怪的是复制出来的记录中都包含了双引号和换行。这个让我感到很困惑,网上简单查了一下,只看到有人提问,却没有答案。看来只有自己想办法来解决这个问题了。
什么原因可能导致结果中出现双引号和换行的问题呢?
思路如下:
1. 工具中的设置有问题。是不是PL/SQL Developer, UltraEdit中有特殊的设置呢?
2. 查询结果是否有异常呢?如查询结果中隐藏着双引号和换行,但在PL/SQL中看不到呢?
验证第一个猜想:
a) 把查询结果分别复制到UltraEdit,csv, Notepad中均发现有双引号和换行。
b) 分别在windows和linux的sql plus中运行同样的sql 查询,发现没有双引号和换行。
c) 查询其它表中的数据复制出来,看不到双引号和换行。
由此可见双引号和换行与数据本身有关.
验证第二个猜想:
在oracle中用dump查看sql的查询结果如下:
SQL> SELECT DUMP(fpath) ,fpath FROM tarchive1 WHERE ROWID='AAFTSIAARAAA9fcAAA';
DUMP(FPATH) FPATH
---------------------------------------------------- ----------------------
Typ=1 Len=8: 49,53,49,46,119,97,118,10 151.wav
Dump出的结果代表什么含义呢?用chr()来查看以下。
SQL> SELECT chr(49),chr(53),chr(49),chr(46),chr(119),chr(97),chr(118), CHR(10) FROM dual;
CHR(49) CHR(53) CHR(49) CHR(46) CHR(119) CHR(97) CHR(118) CHR(10)
------- ------- ------- ------- -------- ------- ------- -------
1 5 1 . w a v
原来chr(10) 代表换行。原来是他惹的祸,现在把它去掉就可以了。
SQL>update TARCHIVE1 set FPATH=replace(FPATH,chr(10),'') WHERE ROWID='AAFTSIAARAAA9fcAAA';
1 row updated
SQL> commit;
Commit complete
SQL> SELECT DUMP(fpath) ,fpath FROM tarchive1 WHERE ROWID='AAFTSIAARAAA9fcAAA';
DUMP(FPATH) FPATH
--------------------------------------------------- ------------
Typ=1 Len=7: 49,53,49,46,119,97,118 151.wav
在把查询结果复制到文本文件中,双引号和换行都不见了。
调查后发现数据是在Windows中编辑,插入到linux下的oracle中的。
由于windows下回车换行是\r\n ,在unix下是\n。 所以导致出现了上述问题。