`
lch_2010
  • 浏览: 35582 次
  • 性别: 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';
分享到:
评论

相关推荐

    Oracle 字符集详解

    Oracle字符集是数据库管理系统Oracle中的一个重要概念,它决定了数据库如何存储和处理文本数据。字符集不仅影响着数据的准确性和一致性,还与全球化应用、数据迁移和数据交换密切相关。本篇将深入探讨Oracle字符集的...

    oracle 字符集修改命令

    ### Oracle字符集修改命令详解 #### 一、引言 在Oracle数据库的管理与维护过程中,字符集的正确设置对于确保数据的正确显示与处理至关重要。由于不同的地区和语言环境对于字符编码的需求各异,因此有时可能需要...

    Oracle字符集专题

    Oracle字符集专题是一个深入探讨Oracle数据库字符集配置、管理和常见问题解决的综合资源。这个专题涵盖了从基础概念到实际操作的多个方面,旨在帮助用户全面理解并有效处理与Oracle字符集相关的各种问题。 首先,...

    oracle 字符集设置

    本文将深入探讨Oracle字符集的相关概念,包括如何通过设置环境变量来修改客户端字符集,以此解决因字符集差异而导致的数据转换或损耗问题。 #### Oracle字符集的重要性 Oracle数据库通过字符集支持多种语言环境下...

    oracle字符集的查看和client字符集的修改

    ### Oracle字符集的查看与客户端字符集的修改 #### 一、Oracle字符集的基本概念 在Oracle数据库系统中,字符集(charset)是用于表示文本数据的编码方式。正确设置和管理字符集对于确保数据的一致性和正确性至关重要...

    jdbc连接oracle字符集不同出现乱码

    ### JDBC 连接 Oracle 字符集不同导致乱码问题解析及解决方案 #### 问题背景 在使用 JDBC(Java Database Connectivity)连接 Oracle 数据库时,可能会遇到一个常见的问题:从远程 Oracle 数据库获取的数据出现乱码...

    oracle字符集快速修改注册表

    总之,Oracle字符集的正确选择和管理对于数据库的正常运行至关重要。通过快速修改注册表,我们可以便捷地在不同字符集之间切换,满足与不同数据库的兼容性需求。在日常工作中,理解并掌握字符集的相关知识,能有效...

    Oracle 修改字符集

    #### 一、理解Oracle字符集 1. **字符集定义**:字符集(Character Set)是一组符号及编码规则的集合,用于存储和处理文本数据。 2. **Oracle中的字符集类型**: - **国家字符集**(National Character Set):如`...

    Oracle 字符集的查看和修改

    ### Oracle字符集的查看与修改详解 #### 一、Oracle字符集概述 Oracle数据库系统支持多种字符集,以便处理各种语言和地区的信息。字符集的选择对于数据的存储和处理至关重要,尤其是在全球化环境中,需要处理多种...

    更改oracle 字符集

    更改oracle 字符集,

    熟知Oracle字符集

    ### 知识点详解:“熟知Oracle字符集” #### 引言 Oracle的多语言支持功能,尤其是字符集的管理,是确保数据正确显示和存储的关键因素。字符集问题常常成为数据库管理和应用程序开发中的一个难点,尤其是在涉及...

    ORACLE 字符集简介

    ### ORACLE 字符集简介 #### 一、字符集基本概念 **ORACLE数据库字符集**,也称为Oracle全球化支持...通过本文的介绍,希望能够帮助读者更好地理解和掌握Oracle字符集的相关知识,从而在实际应用中更加得心应手。

    oracle字符集资料

    Oracle字符集是数据库管理系统Oracle中用于存储和处理文本数据的关键组件。它定义了数据库能够识别和存储的不同字符的集合,包括字母、数字、符号以及特殊字符。深入理解Oracle字符集对于数据库管理员、开发人员和...

    Oracle字符集问题

    Oracle字符集是数据库管理系统Oracle中处理字符数据的关键组成部分,它定义了如何存储和显示各种语言的字符。Oracle字符集问题通常出现在数据库创建、数据输入、数据传输或在不同字符集的系统之间交互时。理解Oracle...

    ORACLE 字符集总结

    本文将深入探讨Oracle字符集的原理、查询方法以及如何处理字符集不一致的问题。 首先,Oracle字符集是一个定义了字节数据解释方式的集合,它具有不同的大小和包容性。Oracle支持多种国家语言,允许用户以本地化的...

    oracle字符集说明

    Oracle字符集是数据库系统中用于表示文本数据的一种编码方式,它是Oracle数据库为了支持多种语言和文化环境而设计的重要特性。Oracle字符集不仅包含了常见的ASCII字符,还包含了各种国家和地区的特殊字符,使得用户...

Global site tag (gtag.js) - Google Analytics