一、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. 源码编译安装MySQL8.0

    源码编译安装MySQL8.0 0.前期准备条件 查看linux的版本 [root@mysql etc]# cat /etc/redhat-release CentOS Linux release 7. ...

  2. spring cloud config与eureka配合使用

    前面两篇介绍了Spring Cloud Config服务端和客户端的简单配置,本篇介绍Spring Cloud Config与Eureka配合使用 前言 默认情况下,配置客户端启动时,都是通过配置属性 ...

  3. Spring Boot 初始化运行特定方法

    Spring Boot提供了两种 “开机自启动” 的方式,ApplicationRunner和CommandLineRunner 这两种方式的目的是为了满足,在容器启动时like执行某些方法.我们可以 ...

  4. Eclipse配置MyBatis的xml自动提示【转】

    如果使用eclipse中,再写mybatis的xml文件的时候,没有提示,用“Alt+/”,不能把代码用快捷键敲出来: 可以试试以下几种方法: 第一种方法: 1.1:打开配置文件,按住Ctrl键,并且 ...

  5. WPF 使用RPC调用其他进程

    如果在 WPF 需要用多进程通信,一个推荐的方法是 WCF ,因为 WCF 是 RPC 计算.先来讲下 RPC (Remote Procedure Call) 远程过程调用,他是通过特定协议,包括 t ...

  6. 菜鸟入门【ASP.NET Core】3:准备CentOS和Nginx环境转(转)

    基本软件 VMware虚拟机 centos:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-170 ...

  7. Flask wtforms实现简单的登录注册

    目录结构 视图 # -*- coding:utf-8 -*- # Author : Niuli # Data : 2019-02-27 19:26 from flask import render_t ...

  8. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

  9. [VUE ERROR] Error in render: "TypeError: Cannot create property 'header' on boolean 'true'"

    项目基于ElemnetUi进行的开发,在引入第三方扩展库 vue-element-extends 之后使用它的表格组件报了这个错 解决方案: 1.  删除项目中的 node_modules 2. 删除 ...

  10. GDAL中GDALDataType中值与其在C++中数据类型对应

    GDAL中的GDALDataType是一个枚举型,其中的值为: GDT_Unknown : 未知数据类型 GDT_Byte : 8bit正整型 (C++中对应unsigned char) GDT_UI ...