动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.Struts VS Turbine.
.Java程序员需要了解的几个开源协.
.JAVA - IO包的学习引导文章.
.开发实体EJB 增强的性能和开发.
.一个简单的Timer Service.
.VRML与JAVA在网络课件中交互运用.
.浅谈实际开发中数据源在JDBC中的.
.JAVA篇:EJB 3.0开发指南之依赖注.
.JBuilder2005 Servlet开发之下载.
.jakarta commons-dbcp.
.Java技巧:使用Jakarta Log Tagl.
.match 方法.
.TOMCAT3.1的安装与配置简要介绍.
.核心API最佳实践——JDK日志分级.
.谈谈Java语言的垃圾收集器.
.通过Java如何实现AES密码算法.
.java开源项目研究 2. 开源的历史.
.OReilly新书推荐:《游戏开发物理.
.制作可以执行的 JAR 文件包及 ja.
.Eclipse 3.2 M6 .

oracle中的数据库乱码的原因与解决

发表日期:2008-1-5 |



  “在SQL*Plus中用insert插进的都是中文的,为什么一存入服务器后,再select出的就是???”
  
  “有的时候,服务器数据先导出,重装服务器,再导入数据,结果,发生数据查询成???”
  
  ……
  
  这些问题,一般是因为字符集设置不对造成的。
  
  很久以来,字符集一直是困扰着众多Oracle爱好者的问题,笔者从事Oracle数据库治理和应用已经几年了,经常接到客户的类似上面提到的有关数据库字符集的“告急”和“求救”,在此我们就这个问题做一些分析和探讨。
  
  首先,我们要明确什么是字符集?字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包括关系,如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失,Oracle对这种问题也要求从子集到超集的导出受支持,反之不行。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
  
  其次,一旦数据库创建后,数据库的字符集是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集是十分重要的。数据库字符集应该是操作系统本地字符集的一个超集。存取数据库的客户使用的字符集将决定选择哪一个超集,即数据库字符集应该是所有客户字符集的超集。
  
  在实际应用中,和字符集问题关系最大的恐怕就是eXP/imp了。在做exp/imp时,假如Client 和Server的nls_lang设置是一样的,一般就没有问题的。但是,要在两个不同字符集的系统之间导数据就经常会有这样或那样的问题,如,导出时数据库的显示正常,是中文,当导入到其他系统时,就成了乱码,这也是一类常见问题。
  
  现在,介绍一些与字符集有关的NLS_LANG参数,
  
  NLS_LANG格式:
  NLS_LANG = language_territory.charset
  
  有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:language 指定服务器消息的语言。
  
  territory 指定服务器的日期和数字格式。
  
  charset 指定字符集
  
  例如: 
  AMERICAN_AMERICA.US7SCII
  
  AMERICAN _ AMERICA. ZHS16GBK
  
  
  还有一些子集可以更明确定义NLS_LANG参数: 
  DICT.BASE 数据字典基本 表版本
  
  DBTIMEZONE 数据库时区
  
  NLS_LANGUAGE 语言
  
  NLS_TERRITORY 地域
  
  NLS_CURRENCY 本地货币字符
  
  NLS_ISO_CURRENCY ISO货币字符
  
  NLS_NUMERIC_CHARACTERS 小数字符和组 分隔开
  
  NLS_CHARACTERSET 字符集
  
  NLS_CALENDAR 日历系统
  
  NLS_DATE_FORMAT 缺省的日期格式
  
  NLS_DATE_LANGUAGE 缺省的日期语言
  
  NLS_SORT 字符排序序列
  
  NLS_TIME_FORMAT 时间格式
  
  NLS_TIMESTAMP_FORMAT 时间戳格式
  
  ……
  通过props$动态性能视图,我们可以查看数据库的字符集信息: 
  $> sqlplus internal
  
  SQL> desc props$
  
  Name Type Nullable Default Comments
  
  NAME VARCHAR2(30)
  
  VALUE$ VARCHAR2(4000) Y
  
  COMMENT$ VARCHAR2(4000) Y
  
  SQL> set arraysize 1
  
  SQL> col value$ format a40
  
  SQL> select name,value$ from props$ where name=‘NLS_CHARACTERSET’;
  
  NAME VALUE$
  
  NLS_CHARACTERSET ZHS16GBK
  
  SQL> select * from sys.props$;
  
  NAME VALUE$
  
  DICT.BASE 2
  
  DBTIMEZONE 0:00
  
  NLS_LANGUAGE AMERICAN
  
  NLS_TERRITORY AMERICA
  
  NLS_CURRENCY $
  
  NLS_ISO_CURRENCY AMERICA
  
  NLS_NUMERIC_CHARACTERS .,
  
  NLS_CHARACTERSET ZHS16GBK
  
  NLS_CALENDAR GREGORIAN
  
  NLS_DATE_FORMAT DD-MON-RR
  
  NLS_DATE_LANGUAGE AMERICAN
  
  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 AM TZH:TZM
  
  NLS_TIMESTAMP_TZ_FORMAT DD-MON- RR HH.MI. SSXFF AM TZH:TZM
  
  NLS_DUAL_CURRENCY $
  
  NLS_COMP BINARY
  
  NLS_NCHAR_CHARACTERSET ZHS16GBK
  
  NLS_RDBMS_VERSION 8.1.6.0.0
  
  NAME VALUE$
  
  GLOBAL_DB_NAME SCPDB1
  
  EXPORT_VIEWS_VERSION 8
  
  22 rows selected
  
  SQL>
  
  从结果可以看出: 
  NLS_LANG = AMERICAN _ AMERICA. ZHS16GBK
  
  虽然,数据库的字符集是在create database的时候指定的,以后不答应改变,但在一个已经建立好的数据库上,我们可以通过修改SYS.PROPS$来修改主要是对应客户端的显示,与存储无关。
  
  如:
  
  SQL> conn / as sysdba
  
  Connected.
  
  SQL> SQL> select * from sys.props$
  
  2 WHERE NAME=‘NLS_LANGUAGE’;
  
  NAME VALUE$
  
  NLS_LANGUAGE AMERICAN
  
  SQL>
  
  SQL> UPDATE sys.PROPS$ SET VALUE$=‘SIMPLIFIED CHINESE’
  
  2 WHERE NAME=‘NLS_LANGUAGE’;
  
  1 row updated
  
  SQL>
  
  SQL> select * from sys.props$
  
  2 WHERE NAME=‘NLS_LANGUAGE’;
  
  NAME VALUE$
  
  NLS_LANGUAGE SIMPLIFIED CHINESE
  
  SQL>
  
  通常出现问题的原因,可分为三种: 
  1. 服务器指定字符集与客户字符集不同,而与加载数据字符集一致。
  
  解决方法:对于这种情况,只需要设置客户端字符集与服务器端字符集一致就可以了,具体操作如下:
  
  * 查看当前字符集:
  
  SQL> select * from sys.props$
  
  2 WHERE NAME=‘NLS_CHARACTERSET’;
  
  NAME VALUE$
  
  
  NLS_CHARACTERSET ZHS16GBK
  
  SQL>
  
  可以看出,现在服务器端Oracle数据库的字符集为‘ZHS16GBK’
  
  * 根据服务器的字符集在客户端作相应的配置或者安装Oracle的客户端软件时指定:
  
  假如还没安装客户端,那么在安装客户端时,指定与服务器相吻合的字符集即可;假如已经安装好了客户端,并且客户端为 sql*net 2.0 以下版本,进入Windows的系统目录,编辑oracle.ini文件,用US7ASCII替换原字符集,重新启动计算机,设置生效;否则,假如,客户端为 sql*net 2.0 以上版本,在Win98 下 运 行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE, 第三步选择 Oracle, 第四步选择 NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集
  
  (本例为:HKEY_LOCAL_MACHINE\
  
  SOFTWARE\ORACLE\NLS_LANG :AMERICAN _ AMERICA. ZHS16GBK)。
  
   假如是UNIX客户端,则: 
  SQL> conn / as sysdba
  
  Connected.
  
  SQL> SQL> UPDATE sys.PROPS$ SET VALUE$=‘SIMPLIFIED CHINESE’
  
  2 WHERE NAME=‘NLS_LANGUAGE’;
  
  1 row updated
  
  SQL> COMMIT;
  
  Commit complete
  
  SQL>
  2. 服务器指定字符集与客户字符集相同,与加载数据字符集不一致。
  
  解决方法:强制加载数据字符集与服务器端字符集一致。要做到这一点,可以通过重新创建数据库,并选择与原卸出数据一致的字符集,然后IMP数据,这种情况仅仅适用于空库和具有同一种字符集的数据。
  
  解决这类问题,也可以先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为foxbase 格式或Access格式数据库,再用转换工具转入到不同字符集的Oracle数据库中,这样就避免了Oracle字符集的困扰。目前数据库格式转换的工具很多,像power builder5.0以上版本提供的pipeline及Microsoft Access数据库提供的数据导入/导出功能等。
  
  3. 服务器指定字符集与客户字符集不同,与输入数据字符集不一致。
  
  对于这种情况,目前为止都还没有太好的解决方法。
  
  通过上面的了解,我们知道,导致在后期使用数据库时出现种种关于字符集的问题,多半是由于在数据库设计、安装之初没有很好地考虑到以后的需要,所以,我们完全可以通过在服务器上和客户端使用相同的字符集来避免由此类问题引出的麻烦
上一篇:实战Visual Basic.Net对话框 人气:536
下一篇:Bugzero的安装过程和碰到的花絮 人气:577
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号