日期:2014-05-17 浏览次数:20846 次
-- 3.5 字符集的更改 ( P94 )
-- 数据库创建以后,如果需要修改字符集,通常需要重建数据库,通过导入导出的方式来转换。也可以通过以下方式更改:
ALTER DATABASE CHARACTER SET
-- 注意修改数据库字符集时必须谨慎,修改之前一定要为数据库备份。由于不能回退这项操作,因此可能会造成数据丢失或者损坏。
-- 这是最简单的转换字符集的方式,但并不是总是有效。这个命令在Oracle 8时被引入Oracle,这个操作在本质上并不转换任何数据库字符,
-- 只是简单地更新数据库中所有跟字符集相关的信息。
-- 这意味着只能在新字符集是旧字符集严格超集的情况下使用这种方式转换。所谓超集是指当前字符集中的每一个字符集在新字符集中都可以表示,并使用相同的代码点,
-- 比如很多字符集都是US7ASCII的严格超集。
-- 如果不是超集将获得以下错误:
SQL> ALTER DATABASE CHARACTER SET ZHS16CGB231280;
*
ERROR at line 1:
ORA-12712: new character_set_must bu a superset of old character set
-- 下面来看一个测试(以下测试在Oracle 9.2.0下进行,Oracle 9i较Oracle 8i在编码方面有较大改变,在Oracle 8i中,测试结果可能略有不同):
SQL> select name, value$ from props$ where name like '%NLS%';
NAME VALUE$
------------------------- -----------------------------------
NLS_LANGUAGE AMERICAN
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
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_RDBMS_VERSION 10.2.0.4.0
20 rows selected.
create table scott.test(id number(18,0), name varchar2(20));
insert into scott.test(id,name) values(1,'盖');
insert into scott.test(id,name) values(2,'gai');
SQL> select name, dump(name) from scott.test;
......
-- 转换字符集,数据库应该在RESTRICTED模式下进行:
C:\> sqlplus "/ as sysdba"
......
SQL> shutdown immediate;
......
SQL> startup moun