以下转自 http://blog.itpub.net/29151695/viewspace-1173238/

最近在linux上安装完oracle 10gR2后,又遇到了字符集乱码的问题,之前在网上找了下,然后解决完后就不了了之了,这次又碰到此类问题,所以就认真下来花点时间去测试了一番,经过一些测试,现在已经解决了问题,现在把自己遇到的问题和解决方法记录一下,方便自己日后查找.

测试环境如下:

测试平台: VMware? Workstation 9.0.2 build-1031769 (注:VM没有分32 or 64位,但如果你安装64bit操作系统时会报错,下面会给出解释)
操作系统: Linux RedHat5.6 64位操作系统
数据库版本: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit

一、VM平台安装64位linux操作系统或其它64bit操作系统时报错.
        1.由于之前安装的都是32的linux操作系统,所以一直相安无事,直到在换了新公司用64bit的linux时才遇到这问题,在VM直接安装64位的linux时,会报类似操作系统的位数与VM平台的不一样(由于当时没有截图,所以具体的提示语我也忘记了),类似有这样的提示:“You have configured this virtual machine to use a 64-bit guest operationg system.However,64-bit operation is not possible.This host does not support VT.”解决此问题,我们需要开启系统的VT支持,即开启自己电脑BIOS虚拟化技术,这个要看具体个人电脑主要是否支持虚拟化技术,有一个工具可以查看你的电脑CPU和主板是否支持虚拟化,具体自己百度找,非常容易找到,只要在BIOS开启虚拟化技术后,再重新安装linux,一切正常了。
二、linux下Oracle显示中文乱码         1.Oracle数据库出现乱码的原因:             <a>操作系统与服务器一致,但客户端与服务器字符集不一致             <b>客户端与服务器一致,但操作系统与服务器不一致         2.解决办法:             设置相关的字符集,保证操作系统、客户端、数据库服务器,保证这三者的字符集都相同。
        3.针对<a>情况:             设置客户端的字符集与服务器一致,假如服务器的字符集为:UTF8(建议创建数据库的时候用这个字符集,中英文都能兼容)             客户端Linux设置步骤:                         1.切换至oracle数据库的安装用户,我的用户名就是oracle                                         $ su oracle                                         $ cd ~                                                //进入oracle用户的家目录                                         $ vim .bash_profile                            //编辑oracle用户下的.bash_profile文件                           .bash_profile文件内容:(每个人的这个文件具体的设置可能都不太一样,不用担心,注意红色那一行就行了)                                                                                        PATH=$PATH:$HOME/bin:/usr/bin:/usr/sbin:/sbin                                                 export PATH                                                 export ORACLE_SID=orcl                                                  export ORACLE_BASE=/u01/app/oracle                                                  export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1                                                  export PATH=$PATH:$ORACLE_HOME/bin                                                  export ORACLE_TERM=xterm                                                  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib                                                 export CLASSPATH=$ORACLE_HOME/JRE:ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
                                               export NLS_LANG=AMERICAN_AMERICA.UTF8                        //设置这个参数就代表设置用户客户端的字符集,在创建数据库的时候不设置这个参数也没问题,建议是最好规划好自己的库需要用到什么时候类型的字体,然后再设置这个值,最好保持与数据库一致,当然这个参数可以随时改变.(我自己的数据库是用UTF8字符集)
                                       
$ source .bash_profile                //执行source命令使修改完的.bash_profile文件生效                          至此,设置完毕,再次登录Oracle数据库,查询显示正常,但有一点要注意,就是如果你插入数据时的字符集不是UTF8下执行的,当你客户端和服务器都变成UTF8字符集后,以后插入的中文可能显示就为乱码了。所以说只有三个点(客户端、操作系统、数据库)的字符集保持一致的时候才能让数据库里面的中文正常显示。
          3.针对<b>情况                        由于我的操作系统是LINUX,所以然我就只对Linux平台给出我自己的方法.因为我自己是在虚拟机上安装的Linux+Oracle来测试中文字体,所以我选择了直接在Linux上安装中文输入法,通过直接输入中文进行测试(PS:当然公司服务器不用考虑这个问题,因为程序员都会把自己的字体设置成与数据库一致的),之所以安装输入法,我就想试试在三者保持一样的情况下是否输入任何中文都没有乱码情况。因为之前我的虚拟机上这三者(操作系统,客户端,数据库)字符不一致的时候,经常会出现在测试数据库里面,有时能正常插入中文并显示,有时候又不行。因此,为了保证自己输入法输入的字符也是UTF8,并且能够直接在虚拟机上输入中文,所以直接在linux安装了中文输入法。                1.这里顺便把LINUX下安装中文输入法的步骤也列一下了,也方便以后自己查找。                         Linux下切换至root用户,在虚拟机上加载linux的安装光盘或者ISO镜像文件                                         # mount /dev/cdrom /mnt                //把ISO文件加载到mnt这个目录,然后进入Server目录查找需要安装的中文输入法安装包                                        # cd /mnt/Server                                       # ls scim*                                          //列出需要的中文输入法安装包,都是以scim开头的文件                          安装中文输入法需要的安装包如下:(要按下面的顺序就安装,安装完后重启linux即可)                                             1.    scim-libs-1.4.4-41.el5.x86_64.rpm

                                            2.    scim-1.4.4-41.el5.x86_64.rpm
                                            3.    scim-chinese-standard-0.0.2-1.el5.x86_64.rpm
                                            4.    scim-tables-0.5.6-7.x86_64.rpm
                                            5.    scim-tables-chinese-0.5.6-7.x86_64.rpm
                                            6.    scim-pinyin-0.5.91-16.el5.x86_64.rpm

# rpm -ivh  scim-libs-1.4.4-41.el5.x86_64.rpm                     //这里只列出安装第一个包的方法,后面5个包的安装方法跟这个一样,至于rmp的用法,自己百度,安装完后记得要重启linux.

2. 安装好中文输入法后,切换至root用户进入到目录 /etc/sysconfig/i18n目录设置linux操作系统的字符集.
                                    $ echo $LANG (或输入:locale)   //查看oracle用户下linux操作系统的字符集
                                    # cat /etc/sysconfig/i18n          //查看linux配置文件里默认设置的字符集字体
                                    # vim /etc/sysconfig/i18n         //修改i18n里面linux的默认字符集
                                    i18n文件内容如下:
                                             LANG="en_US.GBK"     //把这一项的值改成UTF8字符集,改为:LANG="en_US.UTF-8" en_US代表系统本身是用英文显示的,中文为:zh_CN

                                             SYSFONT="latarcyrheb-sun16"

# source /etc/sysconfig/i18n                     //执行source 命令使i18n文件的修改生效.
(PS:其实在修改这个文件夹时候,我遇到一个问题,就是我在linux下找不到ZHS16GBK这个字符集,我用的是Redhat5.6 x64系统,所以当我把LANG设置成:LANG="en_US.ZHS16GBK"的时候,然后再执行source命令的时候,发现会报错,意思是说没有ZHS16GBK这个字符集,用命令locale -a也确实查找不到ZHS16GBK这个字符集,这就是为什么时候我在测试仪环境选择UTF8作为三者的字符集的原因,不过后来想想,一般公司的服务器上只要客户端和oracle服务器的字符集相同时,操作系统的不用理会应该影响也不大,因为程序员开发时,可以在自己的程序指定ZHS16GBK编码,这样程序+客户端+oracle服务器的字符集就一致了,不知道这个猜想正确否?目前还在网上查找能否安装ZHS16GBK字符集的方法).

3.修改完后,再切换回oracle用户,再用命令locale或者是echo $LANG查看下当前的操作系统字符集,你会发现已经和客户端和数据库的一致了,都是UTF8.这个时候你再进入oracle数据库的测试环境时,对表插入中文,修改,查询都正常显示了,不会再有乱码的问题了。

总结:
         字符集的转换是一个非常复杂的过程,上面只是我自己遇到的问题,可能还有一些更复杂的问题,待我发现后再慢慢补充,但前提无非就是要保持三者(操作系统、客户端、数据库服务器)的字符集一致,另外我发现不同的字符集也是可以转换的,但转换的话会有危险,因为你也不清楚哪些时候的转换就出错了,所以最保险的方法就是保持一致.  并且数据库的字符集最好不要更改,一除非是测试环境,正式的生产库最好不要改,风险非常大。所以然在创建数据库的时候就要想好用哪一种字符集.

Example:

SYS@orcl>select * from test;

 
        ID NAME
---------- ----------------------------------------
        99 我们都是好孩子
       123 广州华信息有限公司
 
SYS@orcl>insert into test values(3,'中国广州白云区');
 
1 row created.
 
SYS@orcl>commit;
 
Commit complete.
 
SYS@orcl>select * from test;
 
        ID NAME
---------- ----------------------------------------
        99 我们都是好孩子
       123 广州华信息有限公司
         3 中国广州白云区

解决Linux下Oracle中文乱码的一些心得体会 ,转自的更多相关文章

  1. 解决Linux下sqlplus中文乱码问题

    错误现象:在windows下用其他工具访问oracle,确认中文正常显示.在Linux下使用sqlplus查询数据表中文内容出现乱码. 分析及解决:因为windows下正常,所以问题应出现在Linux ...

  2. 解决linux下unzip中文有乱码的问题

    xxx.zip 中有中文的文件,在linux下unzip就会有乱码. 解决办法:安装7zip 去http://sourceforge.net/projects/p7zip/files/latest/d ...

  3. 解决linux下导入数据库乱码问题

    引言:在windows下的mysql数据库导出SQL文件,在Linux下导入后显示为乱码. 1.启动Mysql服务及创建数据库(下面uushop为我将创建的数据库名) service mysqld s ...

  4. 解决linux下oracle进入sqlplus环境中后退键显示^H、上下键无效与ctrl+l无法清屏等问题【weber出品必属精品】

    习惯linux中上下键回退历史输入的人们肯定也希望sqlplus中也能实现相同的效果,可是不幸的是,sqlplus中不提供诸多方便的快捷键,这个时候我们就需要另外安装一个插件来实现这个想法. 这个插件 ...

  5. 转: 解决MSYS2下的中文乱码问题

    解决方案 新建/usr/bin/win: 12 #!/bin/bash$@ |iconv -f gbk -t utf-8 新建/etc/profile.d/alias.sh: 12345678 ali ...

  6. Linux 下安装中文 ctex 指南

    大家在用 $\LaTeX$ 进行中文排版时相信会遇到不少问题,而$\textbf{ctex}$套装的出现则有效的解决了这一问题,只要安装了$\textbf{ctex}$那么在文中不用进行引用设置就可以 ...

  7. 完美解决 Linux 下 Sublime Text 中文输入

    首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sub ...

  8. 解决linux下oracle-11g打不开dbca问题

    linux下oracle安装完毕后,出现建立数据库命令dbca无法使用问题,如图: 解决办法: 在32位的linux环境下,安装32位oracle11g会有这个bug,主要装个补丁(patch nam ...

  9. Ubuntu下Eclipse中文乱码问题解决(转)

    Ubuntu下Eclipse中文乱码问题解决 把Windows下的工程导入到了Linux下Eclipse中,由于以前的工程代码,都是GBK编码的(Windows下的Eclipse 默认会去读取系统的编 ...

随机推荐

  1. 用python实现逻辑回归

    机器学习课程的一个实验,整理出来共享. 原理很简单,优化方法是用的梯度下降.后面有测试结果. # coding=utf-8 from math import exp import matplotlib ...

  2. win7系统c盘瘦身,去虚拟内存方式

    电脑使用过程中,C盘出现个情况,c盘属性上的大小 > c盘内容加起来的大小 原因就是"虚拟内存"在作祟. 运行  powercfg -h off 关闭系统休眠,删除C盘 hi ...

  3. 关于Hibernate 的数据库配置

    <hibernate-configuration>    <session-factory name="mySessionFactory">        ...

  4. Yii2-Redis使用小记 - Cache(转)

    前些天简单学习了下 Redis,现在准备在项目上使用它了.我们目前用的是 Yii2 框架,在官网搜索了下 Redis,就发现了yii2-redis这扩展. 安装后使用超简单,打开 common/con ...

  5. poj 3321:Apple Tree(树状数组,提高题)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 5629 Descr ...

  6. PHP学习笔记(一)

    by Alina.Xia, dated on 2016.11.27 一.MyAql数据库PHP在开发web站点或管理一些系统时,需要对大量的数据进行保存.XML文件和文本文件虽然可以作为数据的整体,但 ...

  7. 在一般处理文件中访问Session需要添加IRequiresSessionState(转载)

    原文:http://blog.csdn.net/cdsnaspnet/article/details/5695625s 通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝 ...

  8. GCJ 2015-Qualification-C Dijkstra 特殊注意,展开 难度:2

    https://code.google.com/codejam/contest/6224486/dashboard#s=p2 题目中的新运算满足传递性不满足自反性,满足传递性则可以先计算后面的部分再计 ...

  9. 关于CSS Hack

    CSS Hack由于不同厂商的浏览器,如Internet Explorer,Safari,Mozilla Firefox,Chrome 等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS ...

  10. android EditText 只允许输入指定字符

    实现只允许只入数字和字符 方法一:在XML文件中实现布局如下: <EditText android:layout_width="match_parent" android:l ...