[20130106]整和数据库--修改字符集.txt

[20130106]整和数据库--修改字符集.txt

工作需要,需要把几个数据库合并在一起,由于以前数据库使用的字符集是AMERICAN_AMERICA.US7ASCII,而现在的数据库使用
SIMPLIFIED CHINESE_CHINA.ZHS16GBK,整合的时候需要修改字符集,统一到字符集SIMPLIFIED CHINESE_CHINA.ZHS16GBK。

自己google看了一些blog和文档,最终选择这个方式,自己做一个记录:英文字符集转化到中文字符集。当然这个转化的前提
条件是应用表中字段没有clob字段类型。

1.转换方法:
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET aq_tm_processes=0;
ALTER DATABASE OPEN;
update sys.props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';
commit;
--update sys.props$ set value$='AL16UTF16' where name='NLS_NCHAR_CHARACTERSET';
--commit;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=10;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;

COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';

ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
--ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;


2.CLOB字段问题:
实际上这种转换是存在一些小问题的,应用表如果有clob字段(其他字段类型目前不是很清楚是否存在这个问题),显示clob的内容
会存在乱码!如果这些表不多可以采用exp/imp方式(注意导出的文件要做一些小修改)
[注:修改dmp文件00 01 => 03 54,注意2,3字节,以及07 do前面的两处。这种包含clob字段没有测试过]

即使这样,system,sys用户依旧存在一些字段是clob类型的,无法避开这些字段显示出现乱码,这不过对应用影响不大。
SELECT owner, table_name, column_name
  FROM dba_tab_cols
 WHERE data_type = 'CLOB' and table_name not like 'V_%';

执行
select * from sys.METASTYLESHEET;
字段STYLESHEET显示的就是乱码。

SELECT   owner, table_name, COUNT (*)
    FROM (SELECT owner, table_name, column_name
            FROM dba_tab_cols
           WHERE data_type = 'CLOB' AND table_name NOT LIKE 'V_%')
GROUP BY owner, table_name
ORDER BY 1, 2
大约19X个,不过许多是空表。还有一些视图,不过我懒的去解决这些问题,好像对应用影响不大。

关于clob乱码问题,留待以后研究。

上一篇:Comparable助你实现自定义比较 | 带你学《Java语言高级特性》之三十六


下一篇:LINUX修改主机名