水煮oracle23——linux刚安装好的oracle使用insert插入乱码解决

   linux下oracle字符集问题经常会使oracle使用者有点头痛,在这里自己的一点小经验一块给大家分享一下。
oracle在安装时,会有两种字符集供大家选择使用:
1》主字符集:character------主要针对char和varchar、varchar2
2》辅助字符集:national character------nchar、nvarchar、nvarchar2
因为在linux下安装oracle时,环境变量NLS_LANG没有设置的(windows下在安装时,会在regedit中自动设置),所以字符集在linux下需要手动添加这个环境变量,这样在执行select或许insert语句时才会显示正常的汉字中文,否则会出现乱码问题
设置方式:
$ vi .bashrc 或者$ vi .bash_profile
添加:export NLS_LANG=American_America.ZHS16GBK
说明:语言_地区.字符集
oracle常用字符集有:UTF8、AL32UTF8---其中al代表all所有语言
 
如何查询dmp文件的字符集

  用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

  SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;

  ZHS16GBK

  如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):

  cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

修改oracle字符集:
shutdown immediate; //关闭数据库服务器
startup mount;
alter session set sql_trace=true;
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set  utf8;
alter session set sql_trace=false;
shutdown immediate;
startup;
 
字符集乱码原理:
插入乱码,说明客户端字符集和服务器字符集没有成功转换,chcp查询windows客户端字符集936默认,代表ZHS16GBK
注意:使用sqlplus无论select还是insert,sqlplus的字符集一定要和所处的操作系统的字符集一致,这样oracle数据库才能正确存储,不至于发生乱码。
原理:insert时:
如果操作系统字符集是UTF-8,oracle数据库的字符集为AL32UTF8
比如:你好 ---这两个字,首先显示的操作系统编码:使用6位的16进制表示,e4,bd,a0,e5,a5,bd
但是客户端sqlplus的nls_lang=zhs16gbk,操作系统和客户端sqlplus是不会发生字符转换的,
而sqlplus用两位表示一个汉字,这时在sqlplus中有6个字节,就表示有相当于3个汉字的字节,
而insert时客户端sqlplus和oracle数据发生字符集转换,所以就三个汉字的字符在oracle中就生成了9个字节。
说明原理:
   字符集转换是发生在客户端(比如sqlplus)和oracle数据库之间的,客户端和所在操作系统之间是不发生字符集转换的。
可以根据编码分析乱码原因:
 1》查看oracle数据字符集,通过
select * from nls_database_parameters;
或者
select userenv('language') from dual;
 2》查看操作系统字符集
windows:chcp 默认是:936----对应ZHS16GBK
linux:默认的就是UTF-8字符集
说明:16gbk----是2位16进制表示一个汉字,utf-8是三个表示一个汉字
 3》客户端字符集(比如:sqlplus),可以设置变量NLS_LANG
辅助:
windowns操作系统默认字符集:zhs16gbk
linux操作系统默认字符集LANG:utf-8
1、格式: NLS_LANG=language_territory.charset(语言_地域.字符集),每个成分控制了NLS子集的特性。
Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
Territory: 指定服务器的日期和数字格式,
Charset: 指定字符集。
EY:
NLS_LANG=AMERICAN_CHINA.ZHS16GBK   或 AMERICAN_CHINA.UTF8
#NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
#NLS_LANG=”SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
export NLS_LANG
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23890223/viewspace-757996/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23890223/viewspace-757996/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值