oracle sp2-0784,itpub网友问题之AL32UTF8与ZHS16GBK 2种数据库字符集database characterset

itpub论坛问题

原问题:http://www.itpub.net/thread-1943065-1-4.html

安装了数据库11.2.0.4,误将字符集设置为AL32UTF8,本来应该是ZHS16GBK;通过应用软件录入了一些数据,直到一个窗口报错才发现字符集选择错了。

因为AL32UTF8是ZHS16GBK的超集,所以直接将字符集转换为ZHS16GBK后,应用软件进去后,所有中文都变成了乱码,看来直接转换字符集这条路走不通了。

现在想问,有什么办法能将AL32UTF8库里数据导出,导入到新安装的ZHS16GBK库中?

在AL32UTF8库导入前将导入环境字符集设置为ZHS16GBK?然后导出?

分析思路

b9c0a980f258e43a072d1e62823a7cea.png

扩展问题

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函数可以转换指定字符由某数据库字符集转换为另一种数据库字符集,用这个函数我认为最大价值在于预知某些字符是否可以正常转换,即产生数据损失即产生乱码

也可以发现空间增加的问题

ff45f329a2fae14f7ce012678e661db5.png

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            

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值