一般来说,oracle数据导出spool方式,中文出现乱码,这情况是因为数据库服务器和客户端字符集不匹配,执行sqlplus的机器就是客户端,服务器和客户端也可能是一台机器,执行sqlplus之前要先设置客户端的字符集,在linux上:export NLS_LANG=.......
在windows上set NLS_LANG查询数据库字符集:select property_value from database_properties where property_name like 'NLS_CHAR%'
1、比如查询结果是:ZHS16GBK
那你在sqlplus之前要设置:export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
然后再登录sqlplus用spool生成数据
检查下你导出时候的环境变量,导入时的环境变量
2、比如导出时NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
导入时NLS_LANG没有设置,或者设置为其他字符集,则导入的库内汉字就有可能变成乱码。
解决方法,连接数据库的时候设置正确字符集即可。
遇到同样的问题,搜索了很多没有找到切实的方法提供,后来根据搜索到的信息,以及自己不断的尝试总结,终于完全解决spool保存csv时的换行问题,现提供出来供大家参考:table表,列为: reg 注册号,fare_scope 经营范围,因为fare_scope很长,有四种出现分行情况:1、字段前后有“,”号存在,导致分行 2、字段中间半角“,”号也会导致分行,换成全角"," 3、替换掉字段中所有的回车符 chr(13) 4、替换掉字段中所有的换行符 chr(10) ,至此所有能够考虑到的情况都解决,代码如下:
1、sqlplus 用户名/密码@数据库 @runSql.sql --连接数据库,调用脚本 runSql.sql
2、runSql.sql 内容:
--环境设置:
set verify off pagesize 0 echo off--(此处需要注意的是:pagesize 0时有些版本的oracle会导致保存的结果没有 标题,解决的办法下面有说明。)
set feedback off linesize 10000 long 5000 trimout on
set trimspool on arraysize 20
set trims on space 0 newpage none numwidth 12 serveroutput on
set wrap off SQLBLANKLINES ON
set term off
spool d:\wendang\**.csv
--select "注册号"||','||"经营范围" from dual union all select reg||','||fare_scope from table (经营范围的列会出现各种各样的换行、分行、甚至跑到下一列中去。)
--处理后的代码:
select "注册号"||','||"经营范围" from dual union all select reg||','||trim(',' from replace(replace(replace(fare_scope,chr(10)),chr(13)),',',',')) from table
--(所有分行问题解决:1、去掉所有前后,号 2、替换掉所有的半角逗号为全角豆号 3把所有的换行符替换为空字符 4、把所有隐藏的回车符替换为空字符)
spool off
--备注:其中2可能已经包含1,未做尝试,因为如此解决了我所有的可能情况,故未做测试,1的情况是否就是半角“,”号引起的,有兴趣的朋友可以去掉1的处理,尝试下。
其实,遇到分行的问题用第三方工具PLSQL Developer,就不会出现,之前都是这么处理的。pb在保存为csv的时候也会分行,若保存为xls则直接截取了,遇到分行的部分不会出现。而至此解决此问题,则无论在如何情况下查询,考虑到上面的四种情况,就会迎刃而解。遇到了问题能够发现症结之所在并解决才是值得高兴的事情。