解决Linux下Oracle中文乱码的一些心得体会

最近 在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数据库出现乱码的原因:
            操作系统与服务器一致,但客户端与服务器字符集不一致
            客户端与服务器一致,但操作系统与服务器不一致
        2.解决办法:
            设置相关的字符集,保证操作系统、客户端、数据库服务器,保证这三者的字符集都相同。

        3.针对
                         至此,设置完毕,再次登录Oracle数据库,查询显示正常,但有一点要注意,就是如果你插入数据时的字符集不是UTF8下执行的,当你客户端和服务器都变成UTF8字符集后,以后插入的中文可能显示就为乱码了。所以说只有三个点(客户端、操作系统、数据库)的字符集保持一致的时候才能让数据库里面的中文正常显示。

          3.针对情况       
                由于我的操作系统是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 (或输入: l o c ale )    / /查看oracle用户下linux操作系统的字符集
                                                 # cat /etc/sy sconfig/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设置成: L A N G="en_US.ZHS16GBK "的时候,然后再执行source命令的时候,发现 会报错,意思是说没有 Z H S 16GBK这个字符 集,用命令locale -a也确实查找不到ZHS16GBK这个字符集,这就是为什么时候我在测试仪环境选择UTF8作为三者的字符集的原因,不过后来想想,一般公司的服务器上只要客户端和oracle服务器的字符集相同时,操作系统的不用理会应该 影 响也不大 ,因为程序员开发时,可以 在自己的程序指定ZHS16GBK编码 ,这样程序+客户端+oracle服务器的字符集就一致了 , 不知道这个猜想正 确 否 ?目前还在网上查找能否安装ZHS16G BK字符集的方法 ).

                   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 中国广州白云区





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29151695/viewspace-1173238/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29151695/viewspace-1173238/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值