oracle us7ascii 中文,US7ASCII字符集中汉字显示问题

前几天遇到一个US7ASCII字符集的数据库,无论在客户端如何设置字符集都无法通过程序正确读出数据库中的中文汉字,辛苦地查了很多资料,都说是ORACLE的一大BUG,如何解决这一问题呢?在不断的试验中发现,采用OLEDB方式+设置客户端字符集与服务器端字符集使其一致的方法可以在程序中正确读出汉字。兴奋之余,感叹为什么oracle和微软提供的DLL没有考虑到不同字符集之间,数据的一致性问题,从oracle8I到oracle11g跨度如此之久!!!

附字符集说明引用自网上的文章

一、什么是oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE

支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。

影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下:

NLS_LANG =

language_territory.charset

它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:

Language 指定服务器消息的语言,territory

指定服务器的日期和数字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK

从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。

二、如何查询Oracle的字符集

很多人都碰到过因为字符集不同而使数据导入失败的情况。这涉及三方面的字符集,一是oracel

server端的字符集,二是oracle

client端的字符集;三是dmp文件的字符集。在做数据导入的时候,需要这三个字符集都一致才能正确导入。

1、查询oracle server端的字符集

有很多种方法可以查出oracle

server端的字符集,比较直观的查询方法是以下这种:SQL>select

userenv(‘language’) from dual;

结果类似如下:AMERICAN _ AMERICA.

ZHS16GBK

2、如何查询dmp文件的字符集

用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

SQL> select

nls_charset_name(to_number('0354','xxxx')) from dual;

ZHS16GBK

如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):

cat exp.dmp |od -x|head -1|awk

'{print $2 $3}'|cut -c 3-6

然后用上述SQL也可以得到它对应的字符集。

3、查询oracle client端的字符集

这个比较简单。在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如:

set

nls_lang=AMERICAN_AMERICA.ZHS16GBK

这样就只影响这个窗口里面的环境变量。

在unix平台下,就是环境变量NLS_LANG。

$echo $NLS_LANG

AMERICAN_AMERICA.ZHS16GBK

如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。

三、修改oracle的字符集

上文说过,oracle的字符集有互相的包容关系。如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。

一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。

1、修改server端字符集(不建议使用)

在oracle

8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:

$sqlplus /nolog

SQL>conn / as

sysdba;

若此时数据库服务器已启动,则先执行SHUTDOWN

IMMEDIATE命令关闭数据库服务器,然后执行以下命令:

SQL>STARTUP MOUNT;

SQL>ALTER SYSTEM

ENABLE RESTRICTED SESSION;

SQL>ALTER SYSTEM SET

JOB_QUEUE_PROCESSES=0;

SQL>ALTER SYSTEM SET

AQ_TM_PROCESSES=0;

SQL>ALTER DATABASE

OPEN;

SQL>ALTER DATABASE

CHARACTER SET ZHS16GBK;

SQL>ALTER DATABASE

national CHARACTER SET ZHS16GBK;

SQL>SHUTDOWN

IMMEDIATE;

SQL>STARTUP

2、修改dmp文件字符集

上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。

具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:

SQL> select

to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;

0354

然后将dmp文件的2、3字节修改为0354即可。

如果dmp文件很大,用ue无法打开,就需要用程序的方法了。网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好,缺点是比较麻烦)。我在windows下测试通过。但要求oracle数据库一定要安装JVM选项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广东农信迁移上阿里云:系统建设从按月缩短至按天

12月3日,广东省农村信用社联合社银信中心副总裁周丹在2019年阿里云广东峰会上透露,通过携手阿里云,广东农信实现了从传统架构向云化的转型升级,金融业务系统的搭建工期从按月计算缩短至按天计算,效率大幅提升。 周丹在…

阿里云容器服务DaemonSet实践

DaemonSet 保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。下面以日志收集 fluentd 为例,看下如何使用阿里云容器服务控制台创建DaemonSet。 准备Kubernetes环境 在阿里云容器服务控制台中创建Kubernetes…

GIF动画解析RNN,LSTM,GRU

循环神经网络是一类常用在序列数据上的人工神经网络。三种最常见的循环神经网络分别是: 1.维尼拉循环神经网络(vanilla RNN) 2.长短期记忆网络(LSTM),由Hochreiter和Schmidhuber于1997年提出 3.门控循环…

oracle检查外键依赖,Oracle中检查外键是否有索引的SQL脚本分享

COLUMN COLUMNS format a30 word_wrappedCOLUMN tablename format a15 word_wrappedCOLUMN constraint_name format a15 word_wrappedSELECT TABLE_NAME,CONSTRAINT_NAME,CNAME1 || NVL2(CNAME2, ‘,‘ || CNAME2, NULL) ||NVL2(CNAME3, ‘,‘ || CNAME3, NULL) ||NVL2(CNAME4,…

2018最有用的六个机器学习项目

2018年又是人工智能和机器学习快速发展的一年。许多新的机器学习的项目正在以非常高的影响力影响着诸多领域,特别是医疗保健、金融、语音识别、增强现实和更复杂3D视频渲染。 这一年,我们看到了更多的应用驱动研究,而不是理论研究。虽然这可…

雅士利牵手阿里云实现新零售改造,双11全渠道成交金额同比增长超过200%

12月3日在阿里云峰会广州站上,雅士利分享了与阿里云的合作,借助数据中台实现新零售改造。在刚刚结束的天猫双11中,雅士利旗舰店整体线上交易同比增长超3倍,旗下羊奶粉品牌“朵拉小羊”50秒成交额超越618全天成交总额,朵…

安装Vuecli新版本正常,但是显示版本是低版本

安装最新版Vuecli: npm install -g vue/cli查看版本 vue --version如果出现bash: vue: command not found 请参考:https://blog.csdn.net/weixin_40816738/article/details/106151054 如果版本显示是低版本的 找到本地仓库,进入到这个目录下面执行命令…

到底什么成就了今天的人工智能?(上)

维基百科对智能有如下定义: 智能是一种能够感知或推断信息,并将其作为知识留存下来,自适应地用于某种环境或上下文的能力。 人工智能(Artificial Intelligence) 虽然我们很难对人工智能做一个确切的解释,但…

平板电脑可以开发php吗,PHP代码判断设备是手机还是平板电脑(两种方法)

现在移动互联网越来越发达,很多的网站都普及了手机端浏览,为了更好的让网页在手机端显示,我们都选择了使用CSS媒体查询制作响应式模版,但这也有弊端,例如某些网站的结构是CMS类型的,太多的内容要显示&#…

华为美国研发中心将迁至加拿大;高通CEO否认中国5G超美国:技术上还没有,顶多算并驾齐驱;亚马逊宣布进军量子界……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 每周三次,打卡即…

阿里巴巴,果然开始拥有“预测未来”的能力了

顶灯闪烁,笛声响彻。 救护车载着病人,冲向茫茫车海,在时间的赛道上狂奔。 高德地图、GPS 卫星导航、路面磁感线圈、1300 个路口摄像头同时开动,为这辆救护车勘探最快路线; GPS 传回实时数据,后台根据辅助数…

sonarqube 启动不了,异常提示:远程主机强迫关闭了一个现有的连接

启动sonarqube 6.7.1 报下面的错误: 2018.01.24 10:10:56 WARN app[][o.e.t.n.Netty4Transport] exception caught on transport layer [[id: 0x146de8cb, L:/127.0.0.1:57099 – R:/127.0.0.1:9001]], closing connectionjava.io.IOException: 远程主机强迫关闭了…

性能诊断利器 JProfiler 快速入门和最佳实践

背景 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因…

oracle 出参类型定义,Oracle plsql出参clob类型的操作

Steps:1. DBMS_LOB.createtemporary (store_in_list, TRUE); --获取lob locator2. DBMS_LOB.OPEN(store_in_list, DBMS_LOB.LOB_READWRITE);--打开3. dbms_lob.writeappend(store_in_list, LENGTH(v_result), v_result);--writeappend 在后面追加4. DBMS_LOB.CLOSE(store_in_li…

Sonarqube+maven 分析代码

文章目录一、方式11. 配置2. 编译项目执行命令2.1.编译项目2.2.代码分析3. 分析结果4. 解决bug5. 项目名称二、方式2三、方式3Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,…

刚刚!我被产品小姐姐的笔记本深深吸引了....

今天我看到产品小姐姐的一个东西,我惊呆了,因为我好像看到了黑科技,事情是这个样子的....由于加班写代码,在比较疲劳的时候,就站起来随意的在办公室里走走,放松一下自己的脑神经。走到一个产品小姐姐身边&a…

云栖专辑 | 阿里开发者们的第12个感悟:多维思考,胜过盲目苦干

2015年12月20日,云栖社区上线。2018年12月20日,云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来,寒冬中,最值得投资的是学习,是增厚的知识储备。 所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的…

php中队列控制的方法,学习猿地-php 队列的实现方法

php实现队列的方法:首先新建一个文件“artisan.php”;然后通过“php artisan”执行队列;最后进入redis客户端输入命令“lpush listname a b c d e f g”即可。PHP实现队列的原理(laravel)用过laravel框架的童鞋都知道其自带队列功能&#xff…

阿里开发者们的第13个感悟:工程师需要在循环迭代中成长

2015年12月20日,云栖社区上线。2018年12月20日,云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来,寒冬中,最值得投资的是学习,是增厚的知识储备。 所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的…

倒计时 1 天 | 2019 中国大数据技术大会(BDTC)报名通道即将关闭(附参会提醒)...

2019年12月5-7日,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑数据科技股份有限公司协办的中国大数据技术大会(BDTC 2019)将于北京长城饭店隆重举行。届时,超过百位顶尖技术专家将齐聚于…