`
lch_2010
  • 浏览: 35188 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

oracle字符集

阅读更多
引言
我现在所在的项目组需要把mysql的数据处理后导入到oracle数据库中,在此期间遇到了数据中文乱码问题。下面是我对这个问题的总结。
1、linux操作系统,mysql,oracle安装时字符集的选择。
我的建议是这三者的字符集保持一致,全为utf-8或gdk或gb2312。如果有特殊要求,三者不同也没有关系
我的建议是
Oracle -------àutf-8 ,gb2312,gbk
Linux---------àgbk,gb2312
Mysql--------àlatin1(默认)
A、Linux在安装的时候会给你一个选项让你选择安装的字符集。
B、Oracle安装过程中有一个“常见字符集”的选项。
C、Mysql安装时则要选择 二进制安装包,在configure使加上参数--with-charset 和 --with-collation ,例如:
./configure --with-charset=utf-8
Mysql 默认字符集为latin1,支持中文,所以可以一半选择默认安装即可。
2、字符集更改
如果你的字符集进行不正当的配置,则可以通过下面的方法进行更正。
2.1 linux操作系统字符集更改
在/etc/sysconfig/i18n
通过以下的改变来修改系统的本地化设置:
ja_JP.eucJP 变为 ja_JP.UTF-8
ko_KR.eucKR 变为 ko_KR.UTF-8
zh_CN.GB18030 变为 zh_CN.UTF-8
zh_TW.Big5 变为 zh_TW.UTF-8
使用在 ~/.i18n 中的本地化设置的用户应该在默认的情况下升级到使用 UTF-8 码。
iconv 工具可以被用来把使用原始编码(例如 eucJP, eucKR, Big5, or GB18030)的文件转换成为UTF-8 编码:
iconv -f <native encoding> -t UTF-8 <filename> -o <newfilename>
##################################################
以下是的我的Redhat Enterprise Linux AS 4中/etc/sysconfig/i18n的内容:
##################################################
LANG="zh_CN.UTF-8"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh:zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
##################################################
更改后关闭当前端口重新登入即可。
2.2 mysql数据库字符集的更改
现在网上有三种解决方法
查看Mysql字符集命令
show variables like'character_set%';
A、重新编译安装,见mysql安装部分内容
B、修改/etc/my.cnf文件中的default-character-set=gbk #或gb2312,big5,utf8. 然后重新启动mysql. (用rpm包安装的mysql没有my.cnf文件,可以从其他数据库拷贝一个,但是要注意其他参数配置是否正确)
典型配置为
[client]
default-character-set=utf8

[mysqlhotcopy]
default-character-set=utf8

[mysqld]
character-set-server=UTF8
collation-server=utf8_general_ci
default-character-set=UTF8
default-collation=utf8_general_ci
default-storage-engine=innodb

C、在建库,建表时指定
create database testxxx default charset=utf8
CREATE TABLE `t_agent` (
` ID` smallint(5) NOT NULL
) DEFAULT CHARSET=utf8 ;
这种方法在linux下使用mysql命令时,插入或select显示的数据,要在mysql命令行下先执行set NAMES ‘utf8’;但用程序读入、读出时则不用。
2.3oracle数据库的字符集更改
A、oracle server 端 字符集查询
select userenv(‘language’) from dual
其中NLS_CHARACTERSET 为server端字符集
NLS_LANGUAGE 为 server端字符显示形式
B、查询oracle client端的字符集
$echo $NLS_LANG
如果发现你select 出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集。如果还是有乱码,则有可能是数据库中的数据存在问题,或者是oracle服务端的配置存在问题。
C、server端字符集修改
*****************************************************************
* 更改字符集步骤方法(WE8ISO8859P1 --> ZHS16GBK)            *
*****************************************************************
SQL>
将数据库启动到RESTRICTED模式下做字符集更改:
SQL> conn /as sysdba
Connected.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup mount
ORACLE instance started.
Total System Global Area 236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.

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 ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set

提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:

SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
Database altered.

SQL> select * from v$nls_parameters;
19 rows selected.
重启检查是否更改完成:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.
Total System Global Area 236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.

SQL> select * from v$nls_parameters;
19 rows selected.

我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使
Oracle数据库绕过了子集与超集的校验.
这一方法在某些方面是有用处的,比如测试;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责:
结语(我们不妨再说一次):
对于DBA来说,有一个很重要的原则就是:不要把你的数据库置于危险的境地!
这就要求我们,在进行任何可能对数据库结构发生改变的操作之前,先做有效的备份,很多DBA没有备份的操作中得到了惨痛的教训
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
D、client端字符集修改
在 /home/oracle与 /root用户目录下的.bash_profile中
添加或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 语句
关闭当前ssh窗口。
注意 NLS_LANG变量一定要配置正确否则会引起sqlplus 失效
2.4 SSH,mysql,oracle 界面工具的配置
配置完操作系统、数据库后,要为对应的界面工具进行配置。
A、SSH配置
对于经常在windows下远程ssh到linux的用户而言,putty可能是你最好的选择。可是缺省情况下,putty对中文的支持却让人不敢恭维,如果远程linux的locale设置为zh_CN.*(bg2312,gbk,utf8等等),显示就是乱码。经研究发现,其实putty的中文支持还是很好的,呵呵打开putty主程序,选择window-〉Appearance-〉Font settings-〉Change...,选择Fixedsys字体,字符集选择CHINESE_GB2312。在window-〉Appearance-〉Translation中,Received data assumed to be in which character set 中,把Use font encoding改为UTF-8如果经常使用,把这些设置保存在session里面. 现在打开putty,登录成功后,如果操作系统字符集不是UTF-8,需要在shell中输入:export LC_ALL='zh_CN.utf8',现在已经可以完美的支持中文和utf-8了。
B、myql界面工具的配置
Mysql的界面工具多种多样,在你使用mysql的界面工具时,一定要看准它的字符集是什么。一般php界面默认字符集为latin1。我这里向你推荐Navicat mysql界面工具,它默认为UTF8字符集。还有很多人用mysql-Font,虽然它表面上支持UTF8,但经过现实的严酷考验我已经不再相信它了。
C、oracle界面工具
3、注意
1,存储在UTF-8中的数据会有很多乱码,但是不影响数据的输入输出,当出现乱码时,一要考虑一下,你的浏览界面的工具是否可靠。是否与数据库的编码相同,与数据库的显示字符集相同如NLS_LANGUAGE 为oracle 字符的显示字符集,(对它的值的可靠的修改方法我还没有找到)
2,当倒入数据到数据库中时,我希望大家能用dump工具,而不是把原表文件直接考入到数据库对于的文件夹中,如果这样操作数据还是原来编码,并没有改变编码。
3,向UTF-8的数据库中插入的数据也要使UTF-8的,否则用UTF-8的客户端浏览查询会出现乱码,但是用对应编码格式的客户端则不会
4、附件
在172.16.21.200/workspace/module/small_tools/iconv有一个文件编码转换工具(如系统自带的iconv比起来,当出现不能识别的字符时,会继续转换,而不会退出来)
./iconv -f encoding -t encoding [-c] input-file
五 补充-察看和修改oracle配置
1 su – oracle
2使用sqlplus "/as sysdba"登陆sqlplus
3 SQL> select * from V$NLS_PARAMETERS;
得到类似如下结果
NLS_LANGUAGE                                           SIMPLIFIED CHINESE 
NLS_TERRITORY                                                      CHINA 
NLS_CURRENCY                                                       RMB 
NLS_ISO_CURRENCY                                                   CHINA 
NLS_NUMERIC_CHARACTERS                                             ., 
NLS_CALENDAR                                                    GREGORIAN 
NLS_DATE_FORMAT                                               DD-MON-RR 
NLS_DATE_LANGUAGE                                     SIMPLIFIED CHINESE 
NLS_CHARACTERSET                                               ZHS16GBK 
NLS_SORT                                                           BINARY 
NLS_TIME_FORMAT                                              HH.MI.SSXFF AM 
NLS_TIMESTAMP_FORMAT                           DD-MON-RR HH.MI.SSXFF AM 
NLS_TIME_TZ_FORMAT                                      HH.MI.SSXFF AMTZR 
NLS_TIMESTAMP_TZ_FORMAT                    DD-MON-RR HH.MI.SSXFF AM TZR 
NLS_DUAL_CURRENCY                                                  RMB 
NLS_NCHAR_CHARACTERSET                                      AL16UTF16 
NLS_COMP                                                           BINARY 
NLS_LENGTH_SEMANTICS                                               BYTE 
NLS_NCHAR_CONV_EXCP                                                FALSE
4 如要修改配置,可用如下命令配置各值
SQL> UPDATE    PROPS$ SET VALUE$='xxx' WHERE NAME='NLS_CHARACTERSET';
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics