oracle数据库添加编码,修改oracle数据库字符集编码
==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$表的⽅式修改字符集,在
oracle数据库自动备份方法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.log⽇志⽂件,看CLOB字段存在于哪些表上:
内容如:
ALTER DATABASE CHARACTER SET ZHS16GBK
SYS.METASTYLESHEET (STYLESHEET) - CLOB populated
ORA-12716 signalled during: ALTER DATABASE CHARACTER SET
<
对于⽤户表,可以先将该表导出,然后把该表删掉,等字符转换完毕后在导⼊。
例⼦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.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论