数据插入oracle 数据乱码乱码

如何解决插入Oracle数据中文为乱码问题?
[问题点数:40分,结帖人yangzong20]
如何解决插入Oracle数据中文为乱码问题?
[问题点数:40分,结帖人yangzong20]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年2月 Delphi大版内专家分月排行榜第二2011年1月 Delphi大版内专家分月排行榜第二2010年12月 Delphi大版内专家分月排行榜第二2010年11月 Delphi大版内专家分月排行榜第二2010年10月 Delphi大版内专家分月排行榜第二
2011年3月 Delphi大版内专家分月排行榜第三2010年7月 Delphi大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分260阅读权限20帖子精华可用积分260 信誉积分904 专家积分0 在线时间41 小时注册时间最后登录
稍有积蓄, 积分 260, 距离下一级还需 240 积分
帖子主题精华可用积分260 信誉积分904 专家积分0 在线时间41 小时注册时间最后登录
论坛徽章:0
好友的客户碰到了这样一个问题----通过前台导入数据后发现前台显示这些导入的数据正常,但是用sqlplus看这些新导入的数据全部是乱码。
后来被我发现导致这种现象的原因是前台导入的时候错误的选择了Unicode字符集对源数据的GBK编码做了转换,且NLS_LANG和数据库的NLS_CHARACTERSET一致(都是ZHS16GBK)。而且更要命的是朋友客户刚刚改过NLS_LANG(以前的NLS_LANG设的是AL32UTF8),这直接导致了数据库中有部分数据是GBK编码,而另外一部分数据则是Unicode编码。
Oracle里的字符集的正确理解涉及到NLS_LANG,NLS_CHARACTERSET和客户端OS的字符集这三方面,任何一个不对,都会导致乱码的出现。
我们来看一个实际的例子,我现在库的NLS_CHARACTERSET是ZHS16GBK,我首先想办法以Unicode编码(AL32UTF8)插入字符'美好 ',同时再以GBK编码(ZHS16GBK)也同时插入字符'美好 ':
SQL_testdb&select name,dump(name,16) from t_c;
NAME& && && && && && && && && && && && & DUMP(NAME,16)
----------------------------------------& && && && && &-----------------------------------------------------
缇庡ソ& && && && && && && && && && && &&&Typ=1 Len=7: e7,be,8e,e5,a5,bd,20
美好& && && && && && && && && && && && & Typ=1 Len=5: c3,c0,ba,c3,20
这里就构造出了朋友客户那边的实际情况,NLS_CHARACTERSET为ZHS16GBK的库,但是库里的数据却同时有Unicode和GBK两种编码。
朋友问我----有没有办法让库里已经存在的Unicode编码的数据在sqlplus中正常的显示?
这里是没有办法的,即使把NLS_LANG设置成了AL32UTF8,或者说除非你能找到一个OS是Unicode编码的客户端。这是因为NLS_CHARACTERSET始终都是ZHS16GBK,当你把NLS_LANG设置成了AL32UTF8后,oracle会把已经是Unicode编码的字符'美好 '再次以oracle内置的字符集转换规则从GBK编码转换为Unicode编码:
[P550_04_LAracle@:/dras20/testdb]#export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
SQL_testdb&select name,dump(name,16) from t_c;
NAME& && && && && &&&DUMP(NAME,16)
--------------------& && & --------------------------------------------------------
缂囧骸銈?& && && && &&&Typ=1 Len=7: e7,be,8e,e5,a5,bd,20
缇庡ソ& && && && && &&&Typ=1 Len=5: c3,c0,ba,c3,20
从结果里我们可以看到,现在显示结果更乱了:)
但其实还是有办法让Unicode编码的字符'美好 '正常显示的,只不过这种方法没有实际意义。
我们现在来让Unicode编码的字符'美好 '在sqlplus中恢复正常显示:
[P550_04_LAracle@:/dras20/testdb]#export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
[P550_04_LAracle@:/dras20/testdb]#sqlplus '/ as sysdba';
SQL*Plus: Release 9.2.0.6.0 - Production on Wed Nov 17 08:44:42 2010
Copyright (c) , Oracle Corporation.&&All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
SQL_testdb&update props$ set value$='AL32UTF8' where name='NLS_CHARACTERSET';
1 row updated.
SQL_testdb&
Commit complete.
SQL_testdb&select name,value$ from props$ where name='NLS_CHARACTERSET';
NAME& && && && && &&&VALUE$
--------------------& && && &-----------------------------------------------------------------------------
NLS_CHARACTERSET& &&&AL32UTF8
SQL_testdb&shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL_testdb&startup pfile=/dras20/testdb/inittestdb.ora
ORACLE instance started.
Total System Global Area&& bytes
Fixed Size& && && && && && & 743256 bytes
Variable Size& && && && &
Database Buffers& && && &
Redo Buffers& && && && && &&&798720 bytes
Database mounted.
Database opened.
SQL& select name,dump(name,16) from t_c;
NAME& && && && && && && && && && && && & DUMP(NAME,16)
---------------------------------------- -----------------------------------------------------------
美好& && && && && && && && && && && && & Typ=1 Len=7: e7,be,8e,e5,a5,bd,20
???& && && && && && && && && && && && &Typ=1 Len=5: c3,c0,ba,c3,20
这里的原理就是利用了Oracle只会根据NLS_LANG和数据库的NLS_CHARACTERSET来做字符集的转换,当我把NLS_LANG设为ZHS16GBK,NLS_CHARACTERSET修改为AL32UTF8后,Oracle此时就会把字符'美好 '的Unicode编码07,e7,be,8e,e5,a5,bd,20转换为GBK编码05,c3,c0,ba,c3,20,同时又因为我的客户端OS的字符集编码就是GBK,所以这里我就能正确的看到字符'美好 '了。
有朋友看到这里可能会问:你只修改了props$,但是控制文件里记录的数据库字符集还是ZHS16GBK,你这里已经不一致了。
没关系的,oracle不会允许这种不一致存在,如下是alert log里的相关内容:
Wed Nov 17 10:17:53 2010
SMON: enabling tx recovery
Wed Nov 17 10:17:53 2010
Updating character set in controlfile to AL32UTF8
这跟数据库在open的时候oracle会根据file$的内容去修改控制文件(如果需要的话)多么的相似!
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
不干版主了
UID78707空间积分0 积分42310阅读权限100帖子精华可用积分42310 信誉积分2630 专家积分180 在线时间6258 小时注册时间最后登录
帖子主题精华可用积分42310 信誉积分2630 专家积分180 在线时间6258 小时注册时间最后登录
认证徽章论坛徽章:44
发代码时最好用[code]标签给括起来。这样不会出现表情符号。还不错。
做一个在牛A和牛C之间徘徊的人
想找个不加班的工作好难啊!
(X软工作好几年
过了二建和架构
向着一建挺进前
为了生存还得干程序员)共有 2561 人关注过本帖
标题:C#写入Oracle 中文乱码????
江湖求救!!!!
等 级:新手上路
&&已结贴√
&&问题点数:20&&回复次数:3&&&
C#写入Oracle 中文乱码????
江湖求救!!!!
oracle的字符编码为 ZHS16GBK
C#中Encoding.Default为&GB2312&
我可以读取Oracle数据库中已有的中文内容,并能正确显示(Oracle中的中文通过SQLplus录入),但当我使用C#程序插入中文记录时,发现数据库中显示为乱码,读取出来也为乱码。我试了很多种编码方式,问题都不能解决,求高手解答!!!
搜索更多相关主题的帖子:
等 级:新手上路
自己已解决。
主要问题是: oracle客户端软件的字符编码与服务器端的字符编码不一致造成的。
oracle服务端字符编码为: ZHS16GBK
oracle客户端字符编码为:&&WE8ISO8859P1
解决办法有三种:
(1)修改客户端注册表: 找到Oracle安装注册项下的NLS_LANG,将其值改为&SIMPLIFIED CHINESE_CHINA.ZHS16GBK
(2)通过调用_putenv函数,在程序中用代码设置:
using System.Runtime.InteropS
[DllImport(&msvcrt.dll&)]
private static extern int _putenv(string str);
_putenv(&NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK&);
//数据库操作
_putenv(&NLS_LANG = AMERICAN_AMRICA.WE8ISO8859P1&);
(3)通过C#自带的函数设置环境变量
System.Environment.SetEnvironmentVarible(&NLS_LANG &,& SIMPLIFIED CHINESE_CHINA.ZHS16GBK&);
//数据库操作
System.Environment.SetEnvironmentVarible(&NLS_LANG &,&AMERICAN_AMRICA.WE8ISO8859P1&);
需要注意的是: 第二、三种利用函数进行设置环境变量的操作必须在数据库操作的外边才能生效。
等 级:版主
威 望:178
帖 子:3294
专家分:21129
&&得分:10&
★★★★★为人民服务★★★★★
来 自:湖南
等 级:版主
威 望:53
帖 子:1276
专家分:3629
&&得分:10&
C#超级群 ,欢迎大家的到来!
版权所有,并保留所有权利。
Powered by , Processed in 0.023912 second(s), 9 queries.
Copyright&, BCCN.NET, All Rights Reservedtrackbacks-0
Oracle Sql Loader中文字符导入乱码的解决方案
服务器端字符集NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
控制文件ctl:
CHARACTERSET ZHS16GBK
INFILE 'c:\testfile.txt'
id name desc
FIELDS TERMINATED BY ","
(id,name ,desc )
其中c:\testfile.txt文件中有中文,在将此文件导入到oracle数据库中时,需要设置字符集CHARACTERSET ZHS16GBK
(1)查看服务器端字符集
通过客户端或服务器端的sql*plus登录ORACLE的一个合法用户,执行下列SQL语句:
SQL & select * from V$NLS_PARAMETERS
------------------------
(2)控制文件ctl:
CHARACTERSET ZHS16GBK
INFILE '/inffile/vac/subs-vac.csv'
INTO TABLE INF_VAC_SUBS_PRODUCT
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
USER_NUMBER,
PRODUCT_ID,
EFFECTIVE_DATE DATE "YYYY/MM/DD HH24:MI:SS",
EXPIRATION_DATE DATE "YYYY/MM/DD HH24:MI:SS"
阅读(3507)
&re: Oracle Sql Loader中文字符导入乱码的解决方案[未登录]
9:00:03.2221 如果日期格式是这样要怎么办?&&&&&&
&re: Oracle Sql Loader中文字符导入乱码的解决方案
我也遇到这个问题了。不过我的解决方法是把控制文件的编码改成ANSI。&&&&&&
阅读排行榜
评论排行榜
60天内阅读排行

我要回帖

更多关于 oracle导入数据乱码 的文章

 

随机推荐