oracle insert汉字出错,水煮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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值