itpub论坛问题
原问题:http://www.itpub.net/thread-1943065-1-4.html
安装了数据库11.2.0.4,误将字符集设置为AL32UTF8,本来应该是ZHS16GBK;通过应用软件录入了一些数据,直到一个窗口报错才发现字符集选择错了。
因为AL32UTF8是ZHS16GBK的超集,所以直接将字符集转换为ZHS16GBK后,应用软件进去后,所有中文都变成了乱码,看来直接转换字符集这条路走不通了。
现在想问,有什么办法能将AL32UTF8库里数据导出,导入到新安装的ZHS16GBK库中?
在AL32UTF8库导入前将导入环境字符集设置为ZHS16GBK?然后导出?
分析思路
扩展问题
1,对于数据库字符集没有完全理解,还是浮于表面
2,有空多看官方手册 Oracle? Database Globalization Support Guide
结论
1,不同的地理位置,适用的数据库字符集不同,引申含义即比如我们是中国就应采用这个地理位置的字符集
2,如果原数据库字符集与目标数据库字符集不是父子关系,运行转化数据库字符集会提示如下错误
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
3,父子集数据库字符集转换不会造成数据丢失及存储空间增大2种问题,中文字符不会在转换显示乱码,比如:?之类的
4,字符集AL32UTF8与ZHS16GBK不是父子集数据库字符集关系,所以肯定不能转换,也就回答了坛友的问题了,在字符集转换后肯定会发生乱码,只有父子集数据库字符集方可正常转换
所以一定要在创建数据库前把数据库字符集考虑好,一旦有了业务数据,再转换就风险极大了
5, convert函数可以转换指定字符由某数据库字符集转换为另一种数据库字符集,用这个函数我认为最大价值在于预知某些字符是否可以正常转换,即产生数据损失即产生乱码
也可以发现空间增加的问题
6, v$nls_valid_values可以获取数据库字符集的信息,共计 499种字符集
7,数据库字符集编码方案共计2大类:
单字节及多字节,其中又细分很多子类,请见下测试
测试
---查看与nls相关的字典
SQL> select table_name from dict where lower(table_name) like '%nls%';
TABLE_NAME
------------------------------------------------------------
NLS_DATABASE_PARAMETERS
NLS_INSTANCE_PARAMETERS
NLS_SESSION_PARAMETERS
V$NLS_PARAMETERS
V$NLS_VALID_VALUES
GV$NLS_PARAMETERS
GV$NLS_VALID_VALUES
7 rows selected.
SQL> desc nls_database_parameters;
Name Null? Type
----------------------------------------- -------- ----------------------------
PARAMETER NOT NULL VARCHAR2(30)
VALUE VARCHAR2(40)
SQL> select count(*) from nls_database_parameters;
COUNT(*)
----------
20
当前数据库字符集是WE8MSWIN1252
SQL> col parameter for a30
SQL> col value for a30
SQL> select parameter,value from nls_database_parameters;
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET WE8MSWIN1252
NLS_CALENDAR