转://oracle字符集
一、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字符集的更多相关文章
- ORACLE字符集基础知识
概念描叙 ORACLE数据库有国家字符集(national character set)与数据库字符集(database character set)之分.两者都是在创建数据库时需要设置的.国家 ...
- Oracle字符集的查看查询和Oracle字符集的设置修改
本文主要讨论以下几个部分:如何查看查询oracle字符集. 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题. 一.什么是Oracle字符集 Oracle字符集是 ...
- Oracle字符集与客户端
http://www.linuxidc.com/Linux/2011-11/47383p2.htm 什么是Oracle字符集Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关 ...
- 如何修改Oracle字符集
一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...
- 转Oracle字符集问题总结
Oracle字符集问题总结 分类: Oracle2006-06-04 13:48 1298人阅读 评论(3) 收藏 举报 oracle数据库sqlcharacter存储insert 作者: vston ...
- (转)oracle字符集与汉字
Oracle与汉字问题与字符集 分类: oracle 2012-10-29 17:31 425人阅读 评论(0) 收藏 举报 Oracle字符集引起的几个问题,常见的就是汉字占多少个字节,其次就是字符 ...
- oracle字符集问题总结
在进行web开发和oracle安装的过程中经常有人对字符集搞不清楚,因此对此做一下总结. 1.第一个问题:字符集之间的区别是什么呢? 常见的字符集有:UTF-8和GBK (1)GBK字符集 G ...
- oracle 字符集
---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻 ...
- 论Oracle字符集“转码”过程
本文将通过实验来演示一下Oracle字符集“转码”的确认过程. 1.实验环境说明 客户端是Windows XP操作系统的SQL*Plus程序,客户端字符集是936(对应Oracle的ZHS16GBK字 ...
- Oracle 字符集的查看和修改
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库工具,错误消息,排序次序,日期 ...
随机推荐
- HashMap源码解读(JDK1.7)
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...
- [JZOJ5836] Sequence
Problem 题目链接 Solution 吼题啊吼题! 首先如何求本质不同的子序列个数就是 \(f[val[i]]=1+\sum\limits_{j=1}^k f[j]\) 其中 \(f[i]\) ...
- MySQL基准测试(一)--原因,策略,思路
MySQL基准测试(一)--原因,策略,思路 运用benchmark的原因 验证一些你认为的问题,通过基准测试和模拟数据来验证. 解决生产系统的一些异常 测试系统的当前的运行情况,通过历史的基准测试结 ...
- Oracle,MySQL,sqlserver三大数据库如何获取系统当前时间
Oracle中如何获取系统当前时间:用SYSDATE() MySQL中获取系统当前时间主要有以下几点: (1)now()函数以('YYYY-MM-dd HH:mm:SS')返回当前的日期时间,可以直接 ...
- 调用get_str_time(时间), 就能把毫秒的时间转换成格式化的 ,转化时间戳的方法
function get_str_time(time){ var datetime = new Date(); datetime.setTime(time); var year = datetime. ...
- jQuery实例之ajax请求json数据案例
今天有这样一个需求,点击六个大洲,出现对应的一些请求信息,展示在下面,请求请求过后,第二次点击就无需请求.如图所示:点击北美洲下面出现请求的一些数据 html代码结构: <div class=& ...
- 二层协议--STP协议总结
生成树协议的技术实现与配置注意点 一.stp协议的用途 二.stp协议的运行机制 三.stp协议规范
- Java虚拟机(一)结构原理与运行时数据区域
我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文 ...
- Kotlin入门(17)等式判断的情况
话说等式可是编程语言最基本的表达式之一,不管哪种高级语言,无一例外都采用双等号“==”判断两个变量是否相等:就算是复杂的对象,在Java中也可通过equals函数判断两个实例是否相等.按理说这些能够满 ...
- unresolved external symbol boost::throw_exception
使用boost库,VS生成的时候一直报错, error LNK2019: 无法解析的外部符号 "void __cdecl boost::throw_exception(class std:: ...