一、oracle字符集基础知识
oracle数据库有国家字符集(national character set)与数据库字符集(database character set)之分。两者都是在创建数据库时需要设置的。国家字符集主要是用于nchar、nvarchar、nclob类型的字段数据,而数据库字符集使用很广泛,它用于:char、varchar、clob、long类型的字段数据;

oracle的字符集名字一般由以下部分组成:语言或区域、表示一个字符的比特位数、标准字符集名称(可选项,s或c,表示服务器或客户端)。oracle字符集utf8与utfe不符合此规定,其它基本都是这种格式。nls_lang=<language>_<territory>.<clients characterset>,如:
us7ascii:表示区域是us,用7个比特位表示一个字符,标准的字符集名称为ascii
zhs16gbk:表示简体中文(zht为繁体中文),一个字符需要16位比特,标准的字符集名称为gbk
zhs16cgb231280:表示简体中文,一个字符需要16位比特,标准的字符集名称为gb231280
备注:
1、nls( national language support)国家语言支持
2、gbk编码标准是gb2312编码标准的扩展,但数据库字符集zhs16gbk与zhs16cgb231280之间却不是严格的超集与子集的关系,主要是有些汉字的编码在两个字符集中的数值是不同的,因此它们进行字符集转换时会出现问题。
/*Oracle数据库最早支持的编码方案是US7ASCII。Oracle的字符集命名遵循以下命名规则:<Language><bitsize><encoding> 即: <语言><比特位数><编码> 。比如: AL32UTF8表示:AL,代表all,指使用所有语言;32,,32位;UTF8编码。查看环境变量发现:NLS_LANG=American_America.AL32UTF8,American表示语言;America表示地区;AL32UTF8字符集类型*/

二、查看字符集参数
nls_characterset:字符集;nls_nchar_characterset:国家字符集
数据库可用字符集参数:v$nls_valid_values
数据库实例字符集环境:nls_instance_parameters
数据库服务器字符集:nls_database_parameters(其来源于props$)
会话字符集环境:nls_session_parameters:表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如会话无特殊设置,将与v$nls_parameters一致。
v$nls_parameters 或 userenv('language'):表示当前字符集环境。如在客户端执行,则表示客户端字符集环境。

查看客户端字符集:
---linux或unix平台(须设置了nls_lang,否则是空值)
$ env | grep nls_lang
$ echo $nls_lang
---windows平台
echo %nls_lang% (须设置了nls_lang,否则是空值)
或 查看注册表

设置客户端字符集
---linux或unix平台
export nls_lang=american_america.utf8
或加入到.profile
export nls_lang="simplified chinese_china.zhs16gbk"
---windows平台
set nls_lang=simplified chinese_china.zhs16gbk
set nls_lang=simplified chinese_america.utf8
set nls_lang=american_america.utf8
或修改注册表

客户端的字符集要求与服务器一致,才能正确显示数据库的非ascii字符。如果多个设置存在的时候,优先级关系为:sql function >alter session>环境变量>注册表>参数文件 字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是american_america.zhs16gbk

三、修改数据库字符集
数据库字符集在创建后原则上不能更改。因此,在前期规划和安装之初考虑使用哪一种字符集十分重要。对数据库服务器而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。
有两种方法修改数据库字符集设置
1. 通常需要导出数据库数据,重建数据库,然后再导入数据库数据的方式来转换。
2. 通过alter database character set语句修改字符集,但创建数据库后可以修改的字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如utf8是us7ascii的超集,修改数据库字符集可使用alter database character set utf8。
特别说明,我们最常用的两种字符集zhs16gbk和zhs16cgb231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持修改
关于数据库子集-超级对照表(subset-superset pairs),可以参考官方文档

sql>shutdown immediate;
sql>startup mount;
sql>alter system enable restricted session;
9: sql>alter system set job_queue_processes=0;
sql>alter system set aq_tm_processes=0;
sql>alter database open;
--从子集到父集
sql>alter database character set zhs16gbk;
--如果是从父集到子集,需要使用internal_use参数,跳过超子集检测
sql>alter database national character set utf8;
--sql>alter database national character set internal_use utf8;
sql>shutdown immediate;
sql>startup;
如:alter database national character set utf8;
有可能会出现ora-12717: cannot alter database national character set when nclob data exists 这样的提示信息.这时你用alter database national character set internal_use utf8;就可解决上述问题。

四、案例
1、问题:
一个汉字用GBK存放是2个字符,用AL32UTF8占用3个字符,问题来了:一个字段A varchar2(10)存放了5个汉字,但是存放AL32UTF8的只能存放3个,所以在由ZHS16GBK字符集编码的数据库导出的DMP文件导入到由AL32UTF8字符集编码的数据库时有的表就会提示"字符过长",导入不成功!
2、解决办法:源库是ZHS16GBK字符集,目标库是AL32UTF8,目标库要改字符集
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 setzhs16gbk;
ora-12712: new character set must be a superset of old characterset
错误提示:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:
alter database character set internal_use zhs16gbk; //跳过超子集检测
---alter database national character set internal zhs16gbk;国家字符集一般不修改
alter session set sql_trace=false;
select * from v$nls_parameters;
shutdown immediate;
startup
select userenv('language') nls_lang from dual;

#################################################
附:
1.更改数据库字符集为GBK
SHUTDOWN IMMEDIATE;
STARTUP MOUNT EXCLUSIVE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE NATIONAL CHARACTER SET AL16UTF16; 更改国际字符集
ALTER DATABASE CHARACTER SET ZHS16GBK; 更改本地字符集
SHUTDOWN IMMEDIATE;
STARTUP ;

-- ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;
-- alter database character set internal_use ZHS16GBK ;
-- ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE ZHS16GBK;

2.如果错误信息,请对照一下信息
如果提示:
ORA-12717: Cannot issue ALTER DATABASE NATIONAL CHARACTER SET when NCLOB, NCHAR
or NVARCHAR2 data exists
则更改使用以下语句:
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;

如果提示:
ORA-12712: new character set must be a superset of old character set
则更改使用以下语句:
ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

如果提示:
ORA-12721: operation cannot execute when other sessions are active
则更改使用以下语句:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT EXCLUSIVE;

如果提示:
ORA-01109: database not open
则更改使用以下语句:
ALTER DATABASE OPEN;

如果提示:
ORA-12719: operation requires database is in RESTRICTED mode
则更改使用以下语句:
ALTER SYSTEM ENABLE RESTRICTED SESSION;

转://oracle字符集的更多相关文章

  1. ORACLE字符集基础知识

    概念描叙    ORACLE数据库有国家字符集(national character set)与数据库字符集(database character set)之分.两者都是在创建数据库时需要设置的.国家 ...

  2. Oracle字符集的查看查询和Oracle字符集的设置修改

    本文主要讨论以下几个部分:如何查看查询oracle字符集. 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题. 一.什么是Oracle字符集 Oracle字符集是 ...

  3. Oracle字符集与客户端

    http://www.linuxidc.com/Linux/2011-11/47383p2.htm 什么是Oracle字符集Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关 ...

  4. 如何修改Oracle字符集

    一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...

  5. 转Oracle字符集问题总结

    Oracle字符集问题总结 分类: Oracle2006-06-04 13:48 1298人阅读 评论(3) 收藏 举报 oracle数据库sqlcharacter存储insert 作者: vston ...

  6. (转)oracle字符集与汉字

    Oracle与汉字问题与字符集 分类: oracle 2012-10-29 17:31 425人阅读 评论(0) 收藏 举报 Oracle字符集引起的几个问题,常见的就是汉字占多少个字节,其次就是字符 ...

  7. oracle字符集问题总结

    在进行web开发和oracle安装的过程中经常有人对字符集搞不清楚,因此对此做一下总结. 1.第一个问题:字符集之间的区别是什么呢?   常见的字符集有:UTF-8和GBK   (1)GBK字符集 G ...

  8. oracle 字符集

    ---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻 ...

  9. 论Oracle字符集“转码”过程

    本文将通过实验来演示一下Oracle字符集“转码”的确认过程. 1.实验环境说明 客户端是Windows XP操作系统的SQL*Plus程序,客户端字符集是936(对应Oracle的ZHS16GBK字 ...

  10. Oracle 字符集的查看和修改

    Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库工具,错误消息,排序次序,日期 ...

随机推荐

  1. T-SQL:谓词和运算符(六)

    谓词一般有 where和having,check  谓词只计算 TRUE ,FALSE或者UNKNOWN  逻辑表达式  如 AND 和OR 1.IN 谓词的用法 SELECT orderid, em ...

  2. [SEO基础知识] html标签优化 (摘抄)

    1.<title>页面标题</title> 百度优化全靠它!对于做百度优化来说,一定要记得这个标签可能是你是否真正能够做到网站排名提高的重点,而且这个重点绝对不容忽视.标题主要 ...

  3. .NET JSON 转换 Error ” Self referencing loop detected for type“

    在进行实体转换为Json格式报错如下图: Self referencing loop detected for property 'md_agent' with type 'System.Data.E ...

  4. 【表格设置】HTML中合并单元格,对列组合应用样式,适应各浏览器的内容换行

    1.常用表格标签 普通    <table>           |           <tr>          |           |          <th ...

  5. MYSQL中SHOW的使用整理收藏

    好记性不如乱笔头吧....下面收藏整理了mysql中show 的使用技巧....有需要的博友可以看看哈 a. show tables或show tables from database_name; / ...

  6. Java框架之Struts2(三)

    一.几种国际化输出方式 国际化:国际化的本质,就是查找,替换.程序界面上输出的是国际化消息的 key 所对应的值.Struts2 中的国际化机制,会根据 key 到资源文件中找对应的文本来替换上面的k ...

  7. js之模态对话框

    目标效果:点击页面按钮,显示模态对话框,在模态对话框里点击取消关闭模式对话框. 效果如下 实现代码如下: <!DOCTYPE html> <html lang="en&qu ...

  8. Spring Boot Oauth2缓存UserDetails到Ehcache

    在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模式为UserDetailsService提供缓存功能.该类源 ...

  9. CSS布局设置

    一 盒模型 盒模型 在CSS中,"box model"这一术语是用来设计和布局时使用,然后在网页中基本上都会显示一些方方正正的盒子.我们称为这种盒子叫盒模型. 盒模型有两种:标准模 ...

  10. python之数据类型

    1.整数(int)integer 直接写出数字就是整数例: a = 0#查看变量的数据类型 type() -> #<class 'int'> class类,类型,类别print(10 ...