oracle服务器和客户端字符集的查看和修改

一、什么是oracle字符集 

Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 

影响oracle数据库字符集最重要的参数是NLS_LANG参数。 

它的格式如下:   NLS_LANG = language_territory.charset 

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

其中: 

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

从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。 

所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。 

二.查看数据库字符集 

这涉及三方面的字符集, 

一是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端相同的字符集。 

补充: 

(1).数据库服务器字符集 

select * from nls_database_parameters 

来源于props$,是表示数据库的字符集。 

(2).客户端字符集环境 

select * from nls_instance_parameters 

其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表 

(3).会话字符集环境 

select * from nls_session_parameters 

来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。 

(4).客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件 

字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。 

三、修改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 

注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start) 按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 这样的提示信息 

要解决这个问题有两种方法 

一个是,利用INTERNAL_USE 关键字修改区域设置, 

还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use, 

SQL>SHUTDOWN IMMEDIATE; 

SQL>STARTUP MOUNT EXCLUSIVE; 

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 NATIONAL CHARACTER SET INTERNAL_USE UTF8; 

SQL>SHUTDOWN immediate; 

SQL>startup; 

如果按上面的做法做,National charset的区域设置就没有问题 

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无法打开,就需要用程序的方法了

转载于:https://www.cnblogs.com/chenjianhong/p/4144350.html

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

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

相关文章

Java 按位运算符(,|,^,,)

&(按位与) 定义:针对二进制,只要有一个为0,就为0。2 & 5 02的二进制:00000000 00000000 00000000 000000105的二进制:00000000 00000000 00000000 00000101 |(按位或) 定义:针对二进制&#xff0c…

Oracle 多行合并一行 方法

假如有如下表,其中各个i值对应的行数是不定的 Sql代码 SQL> select * from t; I A D ---------- ---------- ------------------- 1 b 2008-03-27 10:55:42 1 a 2008-03-27 10:55:46 1…

Docker 简单入门(一)

Docker 简介 Docker是一个开源的容器引擎,它有助于更快地交付应。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序-样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。 Docke…

PDF解决方案(2)--文件转PDF

相关专题链接: PDF解决方案(1)--文件上传 PDF解决方案(2)--文件转PDF PDF解决方案(3)--PDF转SWF PDF解决方案(4)--在线浏览 前言:上一篇中讲到的文件上传&…

Docker 常用命令(二)

Docker 镜像常用命令 搜索镜像 可使用 docker search 命令搜索存放在 Docker Hub 中的镜像。例如: docker search java 执行该命令后, Docker 就会在 Docker Hub 中搜索含有 java 这个关键词的镜像仓库。执行该命令后,可看到类似于如下的表格…

Docker 使用Dockerfile构建Docker(三)

Dockerfile 简单使用 先来编写一个最简单的 Dockerfile。 例如&#xff1a; FROM nginx RUN echo <h1>使用Dockerfile构建镜像</h1> > /usr/share/nginx/html/index.html 该 Dockerfile 非常简单&#xff0c;其中的 FORM 、 RUN 都是 Dockerfile 的指令。 FROM …

网络流之最大流问题

Reference&#xff1a; http://blog.csdn.net/rrerre/article/details/6751520 http://blog.csdn.net/y990041769/article/details/21026445 http://www.nocow.cn/index.php/Translate:USACO/NetworkFlow 最大流Edmonds_Karp算法模板&#xff1a; EK算法即增广路算法。 最大流最…

delphi读取excel

简单的例子 1 procedure TForm1.Button1Click(Sender: TObject);2 var3 ExcelApp,MyWorkBook: OLEVariant;4 begin5 opendialog1.Filter:Microsoft Excel Workbook (*.xls)|*.XLS|; 6 edit2.Text : sheet1;7 if opendialog1.Execute then8 begin9 edit1.Text:o…

Docker-compose 常用命令及网络设置(五)

Docker Compose 常用命令 build 构建或重新构建服务。服务被构建后将会以 project_service的形式标记,例如:comoretest db。help 査看指定命令的帮助文档,该命令非常实用。 docker-compose所有命令的帮助文档都可通过该命令查看。 docker-compose he lp COMMAND 示例 docker-co…

浅谈 trie树 及其实现

定义&#xff1a;又称字典树&#xff0c;单词查找树或者前缀树&#xff0c;是一种用于快速检索的多叉树结构&#xff0c; 如英文字母的字典树是一个26叉树&#xff0c;数字的字典树是一个10叉树。 核心思想&#xff1a;是空间换时间.利用字符串的公共前缀来降低查询时间的开销以…

Docker-compose 安装与基本使用(四)

安装 Docker-Compose Compose有多种安装方式,例如通过 shell, pip以及将 Compose作为容器安装等。本次安装以Shell 为主。 通过以下命令自动下载并安装适应系统版本的 Compose: curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(un…

如何开始DDD(完)

连续写了两篇文章&#xff0c;这一篇我想是序的完结篇了。结合用户注册的例子再将他简单丰富一下。在这里只添加一个简单需求&#xff0c;就是用户注册成功后给用户发一封邮件。补充一下之前的代码 public class DomainService {public void Register(User user){if (_userRepo…

git pull 报错:Untracked Fles Preventing Merge

场景 使用 git pull 命令更新报错解决 找到对应的文件删除后重新打开项目。

关于string,我今天科普的

今天下午朋友讨论组上讨论一个关于string的问题&#xff0c;问题是这样的&#xff0c;string a"aaa";string ba;a"bbb",为什么测试b的值不改变&#xff1f;之前我看过一个文章&#xff0c;知道肯定不相等&#xff0c;因为引用地址的一系列问题&#xff0c;…

git pull 报错:The following untracked working tree files would be overwritten by merge

场景 使用 git pull 命令更新报错 Updating d652d1c..fa05549 error: The following untracked working tree files would be overwritten by merge:.idea/encodings.xmlPlease move or remove them before you can merge. Aborting 解决 使用 git clean -d -fx 命令即可。

SpringBoot 配置多数据源

项目Git地址&#xff1a;SpringBoot 配置多数据源&#xff1a;Jacob-multi-data-source 准备工作 准备两个数据库(此模块中两个数据库一个为本地 一个为远程&#xff0c;本地为主&#xff0c;远程为从)。然后建表。 #本地库 CREATE TABLE username (id bigint(11) NOT NULL AUT…

HDU 2912

直线关于球的多次反射&#xff0c;求最后一次反射点 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath>using namespace std; const double inf1e10; const double eps1e-8; struct point {doub…

EMVTag系列3《持卡人基本信息数据》

9F61 持卡人证件号 L&#xff1a;2–26 R&#xff08;需求&#xff09;&#xff1a;数据应存在&#xff0c;在读应用数据过程中&#xff0c;终端不检查&#xff1b; (PBOC2.0第五部分中规定)芯片中持卡人姓名 5F20与持卡人姓名扩展9F0B只能使用一个&#xff0c;另一个必须不…

BindingException: Parameter 'XXX' not found. Available parameters are [collection, list]

应业务需求&#xff0c;需要使用到MQ进行数据上传和下发。传递格式为JSON,服务那边下发JSON数组&#xff0c;接收端将JSON数组转换成List集合&#xff0c;调用Mybatis-plus批量添加saveBatch()。提示字段未找到... org.apache.ibatis.exceptions.PersistenceException: ### Er…

JDK 8 新特性 之 default关键字

前言 Jdk1.8之前的接口中只声明方法&#xff0c;方法具体实现应在子类中进行。Jdk1.8打破了这样的用法&#xff1a;接口中可以实现具体的方法体&#xff0c;只需要加上关键字static或者default修饰即可。 default关键字 public interface UserService {//自定义方法void getUse…