oracle 数据库 NLS_CHARACTERSET 字符集的修改
修改Oracle 数据库字符集总结:
修改方式大约有3种:
方法一: (最安全的方法)
数据库创建以后,如果需要修改字符集,通常需要重建数据库,通过导入导出的方式来转换。
方法二: (最常用的方法)
通过
"alter database character set ZHS16GBK;"
方式修改,但并不总是有效。该命令在Oracle8时被引入Oracle,这个操作在本质上并不转换任何数据库字符,只是简单的更新数据库中所有跟字符集相关的信息。(意味,你只能在新字符集是旧字符集严格超集的情况下使用这种方式转换。)
方法三: (最不安全的方法)
修改SYS.props$表,使用"update
props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';"
方式更改字符集时候,只是修改了 props$
表,只完成了十几的十二分之一的内容,存在数据完整性的隐患。(value$值输入了不正确的字符集,后果可能导致数据库无法启动。)
只对更改后的数据有效,即数据库中原来的数据仍以原字符集被存储。
注意:
1.修改数据库字符集时必须谨慎,修改之前一定要做数据库全量备份。(由于不能回退该项操作,因此可能会造成数据丢失或者损坏。)
2.使用 "alter database character set ZHS16GBK;" 方式更改字符集时候,至少需要更改12张数据字典表;
3.使用"update
props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';"
方式更改字符集时候,只是修改了 props$ 表,只完成了十几的十二分之一的内容,存在数据完整性的隐患。因此,更改字符集尽量使用正常的途径。
4.设置
sql_trace 跟着后台操作:在 mount 模式(SQL> STARTUP
MOUNT;)下面,把会话修改为trace模式(SQL> ALTER SESSION SET
SQL_TRACE=TRUE;),可以跟着数据库的后台操作。(sql_trace是DBA的常用利器之一)
5.实际上当我们更新了字符集,数据库启动时会根据数据库的字符集自动的来修改控制文件的字符集,如果字符集可以识别,更新控制文件字符集等于数据库字符集;如果字符集不可识别,那么控制文件字符集更新为US7ASCII。通过更新props$表的方式修改字符集,在Oracle7之后就不应该被使用.
本节重点解释方法二:
通过 "alter database character set ZHS16GBK;" 方式修改,但并不总是有效。该命令在Oracle8时被引入Oracle,这个操作在本质上并不转换任何数据库字符,只是简单的更新数据库中所有跟字符集相关的信息。
查询字符集信息: "SQL> select name,value$ from props$ where name like '%NLS%';",结果有二十行。
修改步骤:
注意:转换字符集,数据库应该在RESTRICTED模式下进行. (使用DBA登录数据库)
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> set linesize 120;
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
常见问题:
问题1:
SQL> ALTER DATABASE CHARACTER SET ZHS16CGB231280;
ALTER DATABASE CHARACTER SET ZHS16CGB231280
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
原因:
字符集超集问题,所谓超集是指:当前字符集中的每一个字符在新字符集中都可以表示,并使用同样的代码点,比如很多字符集都是US7ASCII的严格超集。如果不是超集,将获得以上错误。
解决方式:
SQL> alter database character set internal_use ZHS16GBK;
SQL> select * from v$nls_parameters;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
备注:
ALTER
DATABASE CHARACTER
SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验。该方法某些方面有用处,比如测试环境;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责。
问题2:
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12721: operation cannot execute when other sessions are active
原因:
字符集超集问题。
解决方式:
SQL> alter database character set internal_use ZHS16GBK;
SQL> select * from v$nls_parameters;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
问题3:
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12716: Cannot ALTER DATABASE CHARACTER SET when CLOB data exists
原因:
数据库存在CLOB类型字段,那么就不允许对字符集进行转换
解决方式:
这时候,我们可以去查看alert<sid>.log日志文件,看CLOB字段存在于哪些表上:
内容如:
ALTER DATABASE CHARACTER SET ZHS16GBK
SYS.METASTYLESHEET (STYLESHEET) - CLOB populated
ORA-12716 signalled during: ALTER DATABASE CHARACTER SET ZHS16GBK...
对于用户表,可以先将该表导出,然后把该表删掉,等字符转换完毕后在导入。
例子1:
SQL> select name,value$ from props$ where name like '%NLS%';
NAME VALUE$
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 11.1.0.6.0
20 rows selected
SQL>
例子2:
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
Session altered.
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
Database altered.
SQL> ALTER SESSION SET SQL_TRACE=FALSE;
Session altered.
oracle 数据库 NLS_CHARACTERSET 字符集的修改的更多相关文章
- 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量
概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...
- Oracle 设置NLS_CHARACTERSET字符集
Oracle 设置NLS_CHARACTERSET字符集 sqlplus "/ as sysdba"SQL> SHUTDOWN IMMEDIATE;SQL> START ...
- 修改Oracle数据库的字符集为UTF-8
1.改客户端字符集:通过WINDOWS的运行菜单运行Regedit,修改注册表 Start -> Run -> Rededit <-| Under registry Editor - ...
- 修改 Oracle 数据库实例字符集
Ø 简介 在 Oracle 中创建数据库实例后,就会有对应使用的编码字符集.当我们设置的字符集与操作系统或者其他软件字符集不一致时,就会出现个字符长度存储一个汉字. 2. SIMPLIFIED ...
- 修改Oracle数据库的字符集
2019年6月,来到了新的环境工作,接触了新的项目. 新的项目需要用Oracle数据库,虽然以前没用过,但是边学边用呗,在安装Oracle数据库的时候完全没有注意到要选择UTF-8的字符集,直接就默认 ...
- oracle数据库的字符集更改
A.oracle server 端 字符集查询 select userenv('language') from dual 其中NLS_CHARACTERSET 为server端字符集 NLS_LAN ...
- oracle数据库更改字符集
在数据迁徙的时候需要使源和目标数据库的字符集.版本等信息统一…… 这里是对一个数据库的设置,需要在两边进行同样的操作. SYS@PROD1> select userenv('language') ...
- linux服务器上修改oracle数据库的字符集
linux服务器上以dba身份进入:sqlplus / as sysdba; 依次执行以下命令:shutdown immediate; startup mount; alter system enab ...
- 在linux上安装完oracle数据库后,如何修改ORACLE_HOSTNAME
1.修改HOSTS文件,添加node2到本机IP地址的映射: [root@node2home]# gedit /etc/hosts 最后一行为添加的: 127.0.0.1 localhost loca ...
随机推荐
- cmd--登录mysql
cmd,Windows 命令提示符(cmd.exe)是 Windows NT 下的一个用于运行 Windows 控制面板程序或某些 DOS 程序的shell程序:或在 Windows CE 下只用于运 ...
- JavaSE——TCP协议网络编程(二)
1.Java网络编程与多线程的综合应用: 类Socket提供了方法getInputStream ()和getOutStream()来得到对应的输入/输出流以进行读/写操作,这两个方法分别返回Input ...
- 位图和SVG用法比较
位图,亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的.这些点可以进行不同的排列和染色以构成图样.当放大位图时,可以看见赖以构成整个图像的无数单个方块.扩大位图尺寸的效果是增大单个像素 ...
- 对Controller的单元测试
在ASP.NET MVC项目的Controller中存在逻辑代码,也需要单元测试.查阅到的资料上,有说ASP.NET MVC框架在设计时便考虑到了满足可测试性,所以相对aspx.Winform来说针对 ...
- Expo大作战(二十)--expo中的Release channels(不重要*)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- LeetCode题解之Merge k Sorted Lists 解法二
1.题目描述 2.分析 利用 vector 存储指针,同时合并k个链表. 3.代码 ListNode* mergeKLists(vector<ListNode*>& lists) ...
- 简单实现MySQL数据库的日志审计
时间 2018-12-23 08:01:11 FreeBuf 原文 https://www.freebuf.com/articles/es/192062.html 主题 MySQL 0×0 背景 ...
- Linux yum源详解
软件包安装方式 0.默认从官网下载包(国内,雅虎,网易,阿里云) cat /etc/yum.repos.d/rhel-source.repo [yum文件目录--redhat6版] [ ...
- 实现CTreeCtrl父子节点的联动选择
本文实现了下面的功能: 当选中父节点时, 其所有子节点全部选中. 当取消选中父节点时, 其所以子节点全部取消选中. 点击子节点时, 根据子节点与其兄弟节点的选中状态, 自动设置父节点的选中状态. 通过 ...
- 第四次作业 重写equals方法
使用上几次用到得User实体类,在其中重写equals方法. @Override public boolean equals(Object obj) { if(obj==null)return fal ...