热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

关于ORACLE数据库中汉字显示乱码-mysql教程

1引言ORACLE数据库作为业界领先的数据库产品,近年来在国内大中型企业中得到了广泛的应用。虽然ORACLE数据库产品本身在本地化方面已做得相当成熟,但还是有不少用户反应汉字显示乱码的问题。如对同一数据库不同的用户对同一表中的username查询却得出了不同

1 引言 ORACLE数据库作为业界领先的数据库产品,近年来在国内大中型企业中得到了广泛的应用。虽然ORACLE数据库产品本身在本地化方面已做得相当成熟,但还是有不少用户反应汉字显示乱码的问题。如对同一数据库不同的用户对同一表中的username查询却得出了不同

  1 引言

  ORACLE数据库作为业界领先的数据库产品,近年来在国内大中型企业中得到了广泛的应用。虽然ORACLE数据库产品本身在本地化方面已做得相当成熟,但还是有不少用户反应汉字显示乱码的问题。如对同一数据库不同的用户对同一表中的username查询却得出了不同的结果:

  “ORACLE??????”和“ORACLE中国有限公司”,显然结果中将中文字符显示为乱码,那么为什么呢?字符集的设置不当是影响ORACLE数据库汉字显示的关键问题。

  2 关于字符集

  字符集是ORACLE为适应不同语言文字显示而设定的。用于汉字显示的字符集主要有ZHS16CGB231280、ZHS16GBK、US7ASCII和UTF-8等。字符集同时存在于服务器端和客户端。服务器端字符集是在安装ORACLE时指定的,字符集登记信息存储在ORACLE数据库字典的V$NLS_PARAMETERS表中;而客户端字符集是在系统注册表(WINDOWS系统)或在用户的环境变量(UNIX系统)中设定的。

  3 字符集的构成与设定

  字符集的构成与设定方式分为客户端与服务器端两种:

  (1)客户端字符集的构成与设定。客户端的字符集是由当前用户的环境变量NLS_LANG设定的。环境变量NLS_LANG的构成:

  NLS_LANG=language_territory.charset

  其中,

  language 指定服务器消息的语言

  territory 指定服务器的日期和数字格式

  charset 指定字符集

  三个成分可以任意组合,例如:

  AMERICAN_AMERICA.US7SCII

  SIMPLIFIED CHINESE_CHINA.ZHS16GBK

  AMERICAN_AMERICA. ZHS16GBK

  客户端字符集的设定方法针对不同操作系统设定方法稍有不同:WINDOWS系统是在注册表项:HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0NLS_LANG中设定;UNIX系统是在当前用户的环境变量中设定,如在当前用户的profile文件中增加一行如下代码:

  NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK;export NLS_LANG

  (2)服务端字符集的构成与设定。服务端字符集的构成体现在数据字典表V$NLS_PARAMETERS的NLS_LANGUAGE、NLS_TERRITORY、NLS_CHARACTERSET三项取值上,其中NLS_CHARACTERSET的取值就是具体的数据库字符集。

  如利用查询语句SQL>SELECT * FROM V$NLS_PARAMETERS;

  可得到如下结果:

  PARAMETER VALUE

  ------------------------------------------------------------

  NLS_LANGUAGE SIMPLIFIED CHINESE

  NLS_TERRITORY CHINA

  ……

  NLS_CHARACTERSET ZHS16GBK

  ……

  即当前数据库使用的字符集是ZHS16GBK。

  数据库服务端的字符集是在创建数据时设定的。但可通过如下方法对已设定的字符集进行修改:

  方法一:重建数据库。建立数据库时将数据库的字符集设定为所需字符集。

  方法二:修改SYS.PROPS$表。即用SYS用户登陆ORACLE后,利用下面语句修改相应的字符集并提交:

  SQL>UPDATE PROPS$ SET VALUE$=’ZHS16GBK‘

  WHERE NAME=’NLS_CHARACTERSET’;

  SQL>COMMIT;

  通过此种方法来更改数据库字符集,只对更改后的数据有效,即数据库中原来的数据仍以原字符集被存储。

  另外,有的还利用CREATE DATABASE CHARACTER SET ZHS16GBK命令暂时的修改字符集,当重启数据库后,数据库字符集将恢复原来的字符集

  4 常见的汉字乱码问题及解决方案

  要在客户端正确显示ORACLE数据库中的汉字信息,首先必须使客户端的字符集与服务器端的字符集一致;其次是加载到ORACLE数据库的数据字符集必须与服务器字符集一致。据此,汉字显示乱码的问题大致可以分为以下几种情况:

  (1)客户端字符集与服务器端字符集不同,服务器端字符集与加载数据字符集一致。这种情况是最常见的,只要把客户端的字符集设置正确即可。具体解决方案:

  第一步:查询V$NLS_PARAMETERS得到服务端的字符集:

  SQL>SELECT * FROM V$NLS_PARAMETERS;

  第二步:根据服务端的字符集设定客户端的字符集,设定方法参见客户端的字符集的设定方式。

  以UNIX系统为例,可在当前用户的profile文件中增加如下两行:

  NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK

  export NLS_LANG

  (2)客户端字符集与服务器端字符集相同,服务器端字符集与加载数据字符集不一致。这种情况一般发生在ORACLE版本升级或重新安装数据库时选择了与原来数据库不同的字符集,而恢复加载的备份数据仍是按原字符集卸出的场合。另一种情况是加载从其它使用不同字符集的ORACLE数据库卸出的数据。在这两种情况中,不管客户端字符集与服务器端字符集是否一致都无法正确显示汉字。具体解决方案:

  方案一:按服务端字符集的修改方法修改服务端字符集与加载数据字符集一致,然后导入数据。

  方案二:利用数据格式转储,避开字符集带来的问题。即先将加载数据倒入到与其字符集一致的数据库中,然后再将数据要么按文本格式导出(数据量较小的情况下),要么通过第三方工具(如POWER BUILDER,ACCESS,FOXPRO等)倒出数据,最后将倒出的数据导入到目标数据库中。

  (3)客户端字符集与服务器端字符集不同,,服务端字符集与输入数据字符集不同。这种情况是在客户端字符集与服务器端字符集不一致时,从客户端输入了汉字信息。输入的这些信息即便是把客户端字符集更改正确,也无法显示汉字。解决方案:修改客户端字符集与服务端字符集一致后,重新输入数据。

  其中:

  sqlplus乱码解决

  export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK (显示英文)

  或

  export NLS_LANG="SIMPLIFIED CHINESE"_CHINA.zhs16cgb231280

  (显示简体中文)

  5 结束语

  根据ORACLE官方文档的说明,一旦数据库创建后,数据库的字符集是不能改变的。因此,提前考虑自己的数据库将选用哪一种字符集是十分重要的。数据库字符集选择的一般规则是将数据库字符集设定为操作系统本地字符集的一个超集,同时数据库字符集也应该是所有客户字符集的超集。如同样是中文环境,在选择ZHS16CGB231280还是ZHS16GBK时,我们更多的情况是选择ZHS16GBK,因为它包含了ZHS16CGB231280字符集。

推荐阅读
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • SQL中UPDATE SET FROM语句的使用方法及应用场景
    本文详细介绍了SQL中UPDATE SET FROM语句的使用方法,通过具体示例展示了如何利用该语句高效地更新多表关联数据。适合数据库管理员和开发人员参考。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文详细介绍了HTML中标签的使用方法和作用。通过具体示例,解释了如何利用标签为网页中的缩写和简称提供完整解释,并探讨了其在提高可读性和搜索引擎优化方面的优势。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
author-avatar
高玉成
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有