更改oracle字符集:把字符集zhs16gbk换成utf8
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
name value$
------------------------------ ------------------------------
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 10.2.0.1.0
20 rows selected.
nls_characterset是数据库字符集,nls_nchar_characterset是国家字符集
oracle中有两大类字符型数据,,varchar2是按照数据库字符集来存储数据。
而nvarchar2是按照国家字符集存储数据的。同样,char和nchar也一样,一是数据库字符符,一是国家字符集。
转换字符集,数据库应该在restricted模式下
首先要确定修改后的字符集是不是修改前的超集,如果不是可能出现相同的代码点对应不同的字符,出现乱码的问题。
出现这个错误是 oracle 只支持从子集到超集的转变
那有什么方法可进行强制转换呢?
该指令会跳过子集与超集的检验,当然强制转换可能会造成数据的损坏,要谨慎使用!!
下面借助eygle的帖子执行。
sql> shutdown immediate
database closed.
database dismounted.
oracle instance shut down.
sql> startup mount;
oracle instance started.
total system global area 1845493760 bytes
fixed size 2021568 bytes
variable size 452986688 bytes
database buffers 1375731712 bytes
redo buffers 14753792 bytes
database mounted.
sql> alter session set sql_trace=true;
session altered.
sql> alter system enable restricted session;
system altered.
sql> alter system set job_queue_processes=0;
system altered.
sql> alter system set aq_tm_processes=0;
system altered.
sql> alter database open;
database altered.
sql> alter database character set internal_use utf8;
database altered.
sql>update props$ set value$='utf8' where