0

0

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

高洛峰

高洛峰

发布时间:2016-12-15 16:46:57

|

2391人浏览过

|

来源于php中文网

原创

最近在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.针对情况:
            设置客户端的字符集与服务器一致,假如服务器的字符集为: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.针对情况       
                由于我的操作系统是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中文乱码的一些心得体会 相关文章请关注PHP中文网!

OneStory
OneStory

OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

2

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

56

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

30

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

59

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

25

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

61

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

50

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

47

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 2.2万人学习

Laravel基础快速入门
Laravel基础快速入门

共15课时 | 1.8万人学习

通用后台管理系统开发(Laravel)
通用后台管理系统开发(Laravel)

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号