oracle mysql 字符集_oracle数据库字符集编码问题

1,查询数据库服务器字符集,其来源于props$,是表示数据库的字符集

Java代码 icon_copy.gif 

icon_star.png

spinner.gif

select * from nls_database_parameters;

select * from nls_database_parameters;

2,客户端字符集环境select   *   from   nls_instance_parameter,其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表

3,会话字符集环境   select   *   from   nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter   session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。

客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter   session>环境变量>注册表>参数文件

字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。

4,修改数据库字符集

1、NLS_LANG参数的修改方法:

1)用SYS用户名登陆ORACLE。

2)查看字符集内容

SQL>SELECT * FROM PROPS$;

3)修改相应的字符子集

SQL>UPDATE PROPS$ SET VALUE$=’SIMPLIFIED CHINESE ‘

WHERE NAME=’NLS_LANGUAGE’;

4) 递交COMMIT;

Oracle10G可以采用下面的方法

Java代码 icon_copy.gif 

icon_star.png

spinner.gif

connect system as sysdba ;

shutdown immediate ;

startup mount ;

alter system enable restricted session ;

alter system set JOB_QUEUE_PROCESSES=0;

alter system set AQ_TM_PROCESSES=0;

alter database open ;

alter database character set internal_use ZHS16GBK ;

shutdown immediate ;

startup ;

connect system as sysdba ; shutdown immediate ; startup mount ; alter system enable restricted session ; alter system set JOB_QUEUE_PROCESSES=0; alter system set AQ_TM_PROCESSES=0; alter database open ; alter database character set internal_use ZHS16GBK ; shutdown immediate ; startup ;

老版本可以参考

Java代码 icon_copy.gif 

icon_star.png

spinner.gif

STARTUP MOUNT;

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

ALTER DATABASE CHARACTER SET ZHS16GBK;

ALTER DATABASE national CHARACTER SET ZHS16GBK;

SHUTDOWN IMMEDIATE;

STARTUP;

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

下面提供三种解决方法:

(1) 服务器端重新安装ORACLE

在重新安装ORACLE 时选择与原卸出数据一致的字符集(本例为 US7ASCII)。

加载原卸出的数据。

这种情况仅仅使用于空库和具有同一种字符集的数据。

(2)强行修改服务器端ORACLE当前字符集

在用imp命令加载数据前,先在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:

SQL > create database character set US7ASCII

* create database character set US7ASCII

ERROR at line 1:

ORA-01031: insufficient privileges

你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上

ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载数据。等数

据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE

数据库,在sql>命令提示符下,运行select * from V$NLS_PARAMETERS,可以看

到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正

确显示。

(3)利用数据格式转储,避开字符集限制

这种方法主要用于加载外来ORACLE数据库的不同字符集数据。其方法如下:

先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为

foxbase 格式或access格式数据库,再用转换工具转入到不同字符集的ORACLE数

据库中,这样就避免了ORACLE字符集的困扰。目前数据库格式转换的工具很多,象

power builder5.0以上版本提供的pipeline,Microsoft Access数据库提供的数

据导入/导出功能 等。转换方法参见有关资料说明。

还有一个方法,没有试验过,仅供参考:

Java代码 icon_copy.gif 

icon_star.png

spinner.gif

修改oracle数据库导出的dmp的字符集

我们修改数据库字符集的时候可以通过exp导出数据库后通过修改dmp文件来实现

具体步骤如下:

1、使用ue打开dmp文件取得第2、3字节的内容,如 00 01,转换成十进制为1

2、查看导出的dmp的字符集

select nls_charset_name(1) from dual;

SQL> select nls_charset_name(1) from dual;

NLS_CHARSET_NAME(1)

-------------------

US7ASCII

3、查看需要转换的字符集对应的id

select nls_charset_id('zhs16gbk') from dual;

SQL> select nls_charset_id('zhs16gbk') from dual;

NLS_CHARSET_ID('ZHS16GBK')

--------------------------

852

4、将查询出的字符集id值转换成16进制数,852转换成16进制为 03 45

将dmp文件中的第2、3字节的内容 00 01替换成 03 45

即完成字符集由US7ASCII转换成ZHS16GBK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值