Oracle 导入导出字符集乱码问题

合集下载

ORACLE乱码问题解决

ORACLE乱码问题解决
'NCHAR VARYING',
'UNKOWN'),
96,
DECODE(CHARSETFORM, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'),
一、修改oracle 字符集
由于Oracle 默认安装了SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1字符集,不修改中文会出现乱码现象,输入如下命令:
[oracle@localhost ~]$sqlplus ‘/as sydba’
SQL>shutdown immediate
SQL>Startup restrict
SQL>select userenv('language') from dual;
SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1
SQL>UPDATE sys.PROPS$ SET value$='ZHS16GBK' WHERE NAME='NLS_CHARACTERSET';
5.ALTER SYSTEM SET AQ_TM_PROCESSES=0;
6.ALTER DATABASE OPEN;
9.COL VALUE NEW_VALUE CHARSET
10.SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
1,
'VARCHAR2',
2,
'NVARCHAR2',

oracle中文乱码解决方法

oracle中文乱码解决方法

oracle中文乱码解决方法1. Oracle数据库设置数据库参数NLS_LANG为使Oracle数据库中存储与显示中文时无乱码问题,可以更改Oracle数据库的数据库参数NLS_LANG,更改该参数为中文字符集,如:simplified Chinese_China.ZHS16GBK,此参数设置会对数据库中的所有字符数据有效。

2. Oracle数据库中多个字符集混用的解决方案一般系统及数据库常用的字符集可能存在多样性,例如全角字符、英文字母、空格等,而Oracle数据库支持了多个字符集,用户可以在数据库中多个字符集混合使用。

例如,用UTF8字符集对中文、英文、全角字符编码;用UTF16字符集对Unicode字符编码;用GBK/GB2312字符集对中文字符编码。

3. 注意SQL语句及字符集的指定为了防止运行SQL语句时出现乱码,应当在SQL语句中指定运行的字符集,如:ALTER SESSION SET NLS_LANGUAGE=AMERICAN_AMERICA.AL32UTF84. 客户端应用指定编码格式对于客户端应用,如sqlplus、PL/SQL开发工具,需要在连接之前指定客户端编码格式以确保传输与显示时无乱码问题,这种解决方案比较常用,在客户端应用中设置NLS_LANG参数,让客户端的中文字符使用Unicode,例如: NLS_LANG = SIMPLIFIED CHINESE_CHINA.UTF8 即可成功连接Oracle数据库解决乱码问题。

5. 数据导入导出中文处理从其他数据库导入Oracle数据库时,应从源数据库中查找出字段编码,在导入时将字段编码转换成Oracle数据库中的字符编码,可以增加数据库中文字符的正常显示。

从Oracle数据库导出数据至其他数据库,应将 Oracle 数据库中的字符编码转换成目标数据库的编码方式,以保证导出数据无乱码状况。

6. 中文乱码的原因分析中文乱码的常见原因之一是程序的编码格式未正确设置,将GBK/GB2312等字符集与UTF-8 等Unicode字符集混用,也会出现中文乱码的情况。

【IT专家】oracle数据库中文乱码的原因与解决

【IT专家】oracle数据库中文乱码的原因与解决

本文由我司收集整编,推荐下载,如有疑问,请与我司联系oracle数据库中文乱码的原因与解决2008/10/23 54423 资料: 很久以来,字符集一直是困扰着众多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_7SCII 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 缺省的日期语。

oracle导入出现字符集问题解决办法

oracle导入出现字符集问题解决办法

oracle导入出现字符集问题解决办法场景:把一台linux上的oracle库的数据捣腾到一台 windows2003上的oracle库中,在捣腾的过程中乱码了!有经验的知道多半是要改windows的注册表。

注册表打开发方式:Win98/98SE/Me运行中输入regedit.exe 无权限限制Win2000/XP1.开始>>运行.中输入regedt322.开始>>运行.中输入regedit第一种方法打开的注册表编辑器和Win98下的一样,而且功能相同,而使用第二种方法打开的注册表编辑器则可以方便的设置权限,建议网络管理员使用第2种方法打开注册表编辑器修改需要修改的权限设置部分以免被他人恶意修改。

Windows Vista/71.在开始菜单搜索框中输入regedit并按回车键.(需要管理员权限)2.在运行中输入regedit.exe(需要管理员权限)1. NLS_LANG 参数组成NLS_LANG参数由以下部分组成:NLS_LANG=<language>_<territory>.<client character set>Language:指定Oracle消息使用的语言,校验,日期中月份和日显示。

Territory:指定默认日期、数字、货币等格式,地区和计算星期及日期的习惯。

Client character set:控制客户端应用程序使用的字符集例如:NLS_LANG=AMERICAN_7ASCIIAMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集通常设置或者等于客户端(如Windows)代码页或者对于unicode应用设置为UTF8在Windows上查看当前系统的代码页可以使用chcp命令:E:\>chcp活动的代码页: 936代码页936也就是中文字符集 GBK,在Microsoft的官方站点上,我们可以遭到关于936代码页的具体编码规则,请参考以下链接:/globaldev/reference/dbcs/936.htm2. 查看 NLS_LANG 的方法Windows使用:注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\NLS_LANG查看Unix使用:env|grep NLS_LANG如:/opt/oracle>env|grep NLS_LANGNLS_LANG=AMERICAN_CHINA.ZHS16GBKWindows客户端设置,可以在注册表中更改NLS_LANG,具体键值位于:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\xx指存在多个ORACLE_HOME时系统编号。

解决Oracle 中文乱码

解决Oracle 中文乱码

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

ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。

它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。

SELECT * FROM V$NLS_PARAMETERS1 NLS_LANGUAGE SIMPLIFIED CHINESE2 NLS_TERRITORY CHINA3 NLS_CURRENCY RMB4 NLS_ISO_CURRENCY CHINA5 NLS_NUMERIC_CHARACTERS .,6 NLS_CALENDAR GREGORIAN7 NLS_DATE_FORMAT DD-MON-RR8 NLS_DATE_LANGUAGE SIMPLIFIED CHINESE9 NLS_CHARACTERSET AL32UTF810 NLS_SORT BINARY11 NLS_TIME_FORMAT HH.MI.SSXFF AM12 NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM13 NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR14 NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR15 NLS_DUAL_CURRENCY RMB16 NLS_NCHAR_CHARACTERSET UTF817 NLS_COMP BINARY18 NLS_LENGTH_SEMANTICS BYTE19 NLS_NCHAR_CONV_EXCP FALSE二、如何查询Oracle的字符集ORACLE有三方面的字符集,一是oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。

Oracle字符集乱码问题解决方法

Oracle字符集乱码问题解决方法

Oracle汉字乱码问题原因及解决方法目录问题现象 (1)问题原因 (1)解决办法 (3)问题现象在开发项目中一直使用的是PostgreSQL,安装方便使用与oracle类似,但是由于性能相比较Oracle还是会差不少,所以一些数据量比较大的项目还是会用到Oracle数据库,但是在安装数据库以后发现中文数据在数据库中会产生乱码,使用PlSql查询依然也是乱码。

如下图所示:问题原因Oracle中出现中文乱码的主要原因是字符集不同。

Oracle中对于字符集来说我们关心三个地方的字符集:● Oracle服务器内部的字符集● NLS_LANG变量里保存的字符集● 客户端应用的字符集Oracle服务器内部的字符集Oracle服务器内部的字符集是Oracle数据库存储数据使用的字符集,可以使用如下的查询语句查询Select userenv('language') from dual;或者:Select name, value$ from props$;NLS_LANG变量里保存的字符集NLS_LANG这个是Oracle设置的一个变量,在Windows中,这个变量保存在注册表中:HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0保存着NLS_LANG变量。

在Unix/Linux中,则需要自己进行设置了。

可以在.profile里面加上NLS_LANG=AMERICAN_AMERICA.ZHS16GBKexport NLS_LANG客户端应用的字符集Oracle客户端使用比较多的是PLSQL Developer 当然目前plsql客户端还不能很好的支持64为的Oracle 当然可以下载Oracle官方的客户端再通过关联可以使用plsql连接上64位的Oracle数据库,这与本文主题略有偏离便不详细描述了。

如果 Oracle服务器内部的字符集和 NLS_LANG变量里保存的字符集相同,在进行Oracle查询时,就会将Oracle中的数据直接查出来,返回给查询用户。

Oracle中汉字的乱码问题

Oracle中汉字的乱码问题

Oracle中汉字的乱码问题ZDNet软件频道时间:2007-10-06作者:中国IT实验室| 中国IT实验室我要评论()本文关键词:开发数据库Oracle在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多。

ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多年从事ORACLE数据库管理。

在国内外大中型数据库管理系统中,把Oracle作为数据库管理平台的用户比较多。

Oracle不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多年从事Oracle数据库管理,经常收到周围用户和外地用户反映有关Oracle数据库汉字显示问题的求援信,主要现象是把汉字显示为不可识别的乱码,造成原来大量信息无法使用。

本文将就这一问题产生的原因和解决办法进行一些探讨,供存在这方面问题的用户朋友参考。

1、原因分析通过对用户反映情况的分析,发现字符集的设置不当是影响Oracle数据库汉字显示的关键问题。

那么字符集是怎么一会事呢?字符集是Oracle为适应不同语言文字显示而设定的。

用于汉字显示的字符集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1等。

字符集不仅需在服务器端存在,而且客户端也必须有字符集注册。

服务器端,字符集是在安装Oracle时指定的,字符集登记信息存储在Oracle数据库字典的V$NLS_PARAMETERS表中;客户端,字符集分两种情况,一种情况是sql*net 2.0以下版本,字符集是在windows的系统目录下的Oracle.ini文件中登记的;另一种情况是sql*net 2.0以上(即32位)版本,字符集是在windows的系统注册表中登记的。

要在客户端正确显示Oracle数据库汉字信息,首先必须使服务器端的字符集与客户端的字符集一致;其次是加载到Oracle数据库的数据字符集必须与服务器指定字符集一致。

java项目连接数据库(oracle)中文乱码问题解决方法

java项目连接数据库(oracle)中文乱码问题解决方法

java项⽬连接数据库(oracle)中⽂乱码问题解决⽅法
今天写了⼀个java项⽬连接数据库,之后写了⼀个执⾏⼊库操作的模块。

此时暴露出⼀个问题就是项⽬的中⽂插⼊到数据库时会是乱码:
项⽬输出的中⽂:
执⾏插⼊操作后数据库中内容:
此时CustomerNumber字段是乱码。

出现这种情况⼀般都是数据库编码与项⽬编码不⼀致导致的,⾸先查看项⽬与数据库的编码格式:
查看项⽬编码:
项⽬的编码是gbk格式
查看数据库编码格式:
数据库编码格式是ISO-8859-1
以上查看编码格式操作可以百度
出现这种情况⼀般可以通过两种⽅式解决。

⼀是修改数据库或者项⽬的编码格式,⼆是对⼊库的中⽂进⾏编码转换。

第⼀种⽅式在项⽬初期可以这样搞,但是考虑到修改编码可能会影响其他模块的功能导致其他模块出现乱码。

所以我⼀般采⽤第⼆种⽅式。

转换编码后,⼊库中⽂乱码解决:。

ORACLE学习之八 ORACLE的导入导出的字符集处理

ORACLE学习之八 ORACLE的导入导出的字符集处理

TO_NUMBER(0354,'XXXX')
----------------------
852
--将852带入查询,可以知道导出的DMP的字符集是ZHS16GBK
SQL> SELECT nls_charset_name(852) from dual;
PARAMETER VALUE
------------------------------ ------------------------------------------------
NLS_CHARACTERSET ZHS16GBK
OR分类:ORACLE 学习
--查看导出DMP文件的字符集
--二进制编辑器打开DMP文件(文件较小的情况下),查看第2,3个字节的内容,例如查看到的是03 54
SQL>SELECT to_number(0354,'xxxx') from dual;
NLS_CHAR
--------
ZHS16GBK
--总结导入导出,要做到导出的字符集,导入的客户端字符集和导入段的服务器字符集相一致,否则很容易出现乱码。
--查看服务器端字符集的方法
SQL> select * from nls_database_parameters where PARAMETER='NLS_CHARACTERSET';
--查看客户端字符集的方法。
--Win下查看注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_OraDb10g_home1下NLS_LANG的值,最后一个单词就是客户端的字符集。
--SIMPLIFIED CHINESE_CHINA.ZHS16GBK

数据库出现乱码的原因和解决办法

数据库出现乱码的原因和解决办法

数据库出现乱码的原因和解决办法数据库出现乱码的原因和解决办法“在SQL*Plus中insert进的都是中文的,为什么一存入服务器后,再select出的就是”“有的时候,服务器数据先导出,重装服务器,再导入数据,结果,发生数据查询成”……这些问题,一般,是因为字符集设置不对照成的。

很久以来,字符集一直是困扰着众多Oracle爱好者的问题,笔者从事Oracle数据库管理和应用已经几年了,经常接到客户的类似上面提到的有关数据库字符集的“告急”和“求救”,今天,就这个问题打算做一些分析和探讨。

首先,我们要明确什么是字符集?字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包括关系,如us7ascii就是zhs16gbk 的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失,oracle对这种问题也要求从子集到超集的导出受支持,反之不行。

在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。

其次,一旦数据库创建后,数据库的字符集是不能改变的。

因此,在设计和安装之初考虑使用哪一种字符集是十分重要的。

数据库字符集应该是操作系统本地字符集的一个超集。

存取数据库的客户使用的字符集将决定选择哪一个超集,即数据库字符集应该是所有客户字符集的超集。

在实际的应用中,和字符集问题最相关的恐怕就是exp/imp了。

在做exp/imp是,如果client 和server的nls_lang设置是一样的,一般就没有问题。

但是,要在两个不同字符集的系统之间导数据就经常会有这样那样的问题,如,导出时数据库的显示正常,是中文,当导入到其他系统时,就成了乱码,这也是一类常见问题。

对于这个问题,有一个常用的转换方法,首先用一个二进制编辑器(如,UltraEdit)察看到出文件(DMP文件)的第二和第三字节,这两个字节的内容是服务器端的字符集,比如0001,那么在数据库中查找出它代表的字符集:然后,如果在导入数据时需要修改为ZHS16GBK,我们就需要知道如何修改这两个字节才能让他们和ZHS16GBK对应:因此,可以将这两个字节手工修改为0354(不足4位时前面补0),然后就可以正常导入数据了。

ORACLE乱码问题解决

ORACLE乱码问题解决

ORACLE乱码问题解决一、修改oracle 字符集由于Oracle 默认安装了SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1字符集,不修改中文会出现乱码现象,输入如下命令:[oracle@localhost ~]$sqlplus ‘/as sydba’SQL>shutdown immediateSQL>Startup restrictSQL>select userenv('language') from dual;SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1SQL>UPDATE sys.PROPS$ SET value$='ZHS16GBK' WHERE NAME='NLS_CHARACTERSET';SQL>shutdown immediateSQL>startup;SQL> select userenv('language') from dual;USERENV('LANGUAGE')---------------------------------------------------AMERICAN_AMERICA.ZHS16GBK这样把WE8ISO8859P1改变成'ZHS16GBK' 。

如果执行了修改字符后,重启oracle数据库仍然是WE8ISO8859P1字符集,请重启linux系统即可。

二、执行第一点中的修改后,数据库报错ora-06553:pls-553:character set name is not recognized确认字符集是否修改的不彻底。

SELECT DISTINCT (NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET,DECODE(TYPE#,1,DECODE(CHARSETFORM,1,'VARCHAR2',2,'NVARCHAR2','UNKOWN'),9,DECODE(CHARSETFORM,1,'VARCHAR',2,'NCHAR VARYING','UNKOWN'),96,DECODE(CHARSETFORM, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'), 112,DECODE(CHARSETFORM, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_INFROM SYS.COL$WHERE CHARSETFORM IN (1, 2)AND TYPE# IN (1, 9, 96, 112);CHARACTERSET TYPES_USED_IN-------------------- -------------AL16UTF16 NCHARAL16UTF16 NCLOBAL16UTF16 NVARCHAR2UTF8 CHARUTF8 VARCHAR2WE8ISO8859P1 CHARWE8ISO8859P1 CLOBWE8ISO8859P1 VARCHAR2确实在数据库的列属性中仍然存在着多个字符集的设定,报错的原因。

Oracle数据导入中文出现乱码,Oracle字符集的问题

Oracle数据导入中文出现乱码,Oracle字符集的问题
Oracle导入出现乱码的,一般的问题所在大都是由于DMP字符集与目标数据字符集不一致而生产的。 该问题在网上可是大堆。可是有时候按网上所描述的处理方法可能不成功。呵呵,我也是因为这样才在此写写的。 进入问题。 平时我们遇到该问题一般都采用的是,两种方法: 1, 找到导出DMP数据库,修改源数据库字符集和目标数据字符集一致,重新导出字符集修改后的dmp ,重新导入目标数据库解决; 这样的方法首先是工作量比较大,如果导出的DMP比较大,需要耗费很多时间;另外,受条件限制需要修改源数据字符集,有很多时候不方便或根本无法找到源数据库; 2, 比较通用的方法是按DMP的字符集,修改目标数据库字符集,使数据库字符集与DMP字符集一致,顺利导入DMP数据,问题解决。 3, 除了以上两种方法,还有一种既方便,又实用的好方法:就是利用u~edit 可以打开dmp文件,直接修改DMP,使DMP的字符集和目标数据库字符集一致,顺利导入。 下面我通过我实际做的一个例子介绍给大家: 提供的数据的字符集为:US7ASCII 目数据库的字符集为:ZHS16GBK 在Oracle查的十六进制为: select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual; 0354 用u~edit 可以打开dmp文件,直接修改DMP,修改如图: 修改如下的3个地方。 网上大部分修改的只是第一行的地方,可是由于Oracle版本的不一样,有时候修改完了还是发现出现乱码,这样的话,得必须的修改3个地方才行。

oracle中文乱码解决方法

oracle中文乱码解决方法

oracle中文乱码解决方法
oracle中文乱码解决方法
Oracle中文乱码解决方法
Oracle是一款非常流行的数据库管理系统,但是它有一个比较烦人的问题,就是中文乱码的问题,很多用户反映在使用Oracle时会遇到中文乱码,这让不少用户感到很恼火。

那么,Oracle中文乱码应该如何解决呢?
我们必须确定乱码的原因。

通常,中文乱码的原因有三种:第一种是Oracle数据库编码和程序编码不一致;第二种是Oracle数据库字符集不支持中文;第三种是Oracle数据库表字段设置不正确。

当我们确定了乱码的原因之后,就可以根据具体问题进行解决。

如果是数据库编码和程序编码不一致的问题,我们可以在Oracle数据库中指定编码,这样就可以解决乱码问题;如果是Oracle数据库字符集不支持中文,我们可以在Oracle数据库中添加支持中文的字符集,以解决乱码问题;如果是Oracle数据库表字段设置不正确,我们可以修改表字段的编码,以解决乱码问题。

解决Oracle中文乱码的方法有很多,但是要恰当地识别出乱码的原因,并采取相应的措施,才能有效地解决乱码问题。

因此,当我们遇到Oracle中文乱码问题时,要认真检查,找出乱码的原因,并采取相应措施,解决Oracle中文乱码问题。

Oracle数据库工具中文显示乱码问题的解决

Oracle数据库工具中文显示乱码问题的解决

Oracle 数据库工具中文显示乱码问题的解决Oracle客户端查询工具有时会有查处的结果为中文时不能正常显示,要么为乱码,要么为问号,plsql出现这种问题,以为是版本造成的,用了老的和最新的还是一样,换了另外的数据库工具也一样,但注意一点,数据其实是没有问题的,取出来显示是正常的中文,只是在工具里显示的是问号。

其实问题的原理很简单,就是字符集设置不正确造成的,但如此简单的原理在解决的过程中却会遇到很多麻烦,下面结合我遇到和解决的过程,给朋友们一点思路,说不定你们跟我的问题一样,通过这篇文章不用再折腾了,很快搞定,感觉飘飘……首先讲讲字符集的知识,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文件的字符集。

在做数据导入的时候,需要这三个字符集都一致才能正确导入。

orcale 乱码原因与解决方法

orcale 乱码原因与解决方法

解决方法1、insert之前先设定nls_lang环境变量为中文,然后再插入中文数据export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"orexport NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS32GB18030"如果这样后,反而插不进去,或者仍然为乱码,表示当初再建库时,没有选择中文字符集(export NLS_LANG=AMERICAN_AMERICA.AL32UTF8)2、dbca一个新库,在字符集处选择中文3、强行修改服务器端ORACLE当前字符集(此方法没有试过,但应该是要在安装db的时候已经安装了此字符集,属猜测)在用cmp命令加载数据前,先在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:SQL >; create database character set US7ASCII1.* create database character set US7ASCII2.ERROR at line 1:3.ORA-01031: insufficient privileges你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上ORACLE数据库的字符集已被强行修改为US7ASCII,接着用cmp命令装载数据。

等数据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE数据库,在sql>;命令提示符下,运行select * from V$NLS_PARAMETERS,可以看到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正确显示。

4、利用数据格式转储,避开字符集限制这种方法主要用于加载外来ORACLE数据库的不同字符集数据。

exp、imp导入数据乱码、plsql中文乱码,显示问号

exp、imp导入数据乱码、plsql中文乱码,显示问号

1.登陆plsql,执行sql语句,输出的中文标题显示成问号????;条件包含中文,
则无数据输出
2.输入sql语句select * from V$NLS_PARAMETERS查看字符集,查看第一
行value值是否为简体中文
3.进入注册表,依次单击HKEY_LOCAL_MACHINE --->SOFTWARE --->
ORACLE--->home(小编安装的是Oracle 11g,这里显示成
KEY_OraDb11g_home1),找到NLS_LANG,查看数值数据是否为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
4.如果以上设置都没有问题,那就要查看下环境变量的设置,查看是否有变量
NLS_LANG,没有则新建该变量
5.新建变量,设置变量名:NLS_LANG,变量值:SIMPLIFIED
CHINESE_CHINA.ZHS16GBK,确定即可
6.退出plsql,重新登陆plsql。

输入sql语句,执行,中文标题终于正常显示,
也有数据输出了
注册表,NLS_LANG值与环境变量中的NLS_LANG值保持一致。

解决oracle导入dmp存储过程乱码问题

解决oracle导入dmp存储过程乱码问题

使用edge或者MarkTool导入dmp,通过客户端连接到服务器的方式导入dmp一般不会出现存储过程乱码。

在windows 2008 R2 64位操作系统下,本机安装MarkTool导入dmp会导致存储过程乱码,需要在操作系统中增加环境变量
(1)右键点击【计算机】选择【属性】,如图1,选择高级系统设置
图1
(2)选择高级标签页,点击【环境变量】,如图2
图2
(3)在环境变量里的【系统变量】栏中点击【新建】增加环境变量,变量名NLS_LANG,变量值SIMPLIFIED CHINESE_CHINA.ZHS16GBK就可以了。

(4)学会了之后,嫌麻烦可以双击【设置环境变量.bat】这个批处理命令。

可以代替之前的1,2,3步。

(5)导出dmp测试一下是否成功,只要导出dmp时,cmd命令行的提示是中文的就代表设置成功。

oracle imp导入中文乱码

oracle imp导入中文乱码

客户给了7个dmp文件共15G左右,需要导入到测试环境,结果导入是成功了,但中文都是乱码。

也只怪自己没注意刚开始的提示信息:Java代码1.import done in US7ASCII character set and AL16UTF16 NCHAR character set2.import server uses WE8ISO8859P1 character set (possible charset conversion)3.export client uses ZHS16GBK character set (possible charset conversion)系统有提示编码对不上,查了半天只能重来了,幸好数据库是新安装的,20G的数据量还是比较大,于是先把表空间和用户都删除了干脆一干二净重来。

Java代码1.drop tablespace XXXX INCLUDING CONTENTS;2.drop user XXXX cascade;3.4.然后到之前存放数据文件的目录把20个数据文件也删除了。

附监听命令:启动监听:lsnrctl start查看监听:lsnrctl status停止监听:lsnrctl stop因安装oracle以及新建实例时未注意字符集,修改数据库字符集相对简单也方便就改数据库字符集了。

按照网上:Java代码1.SQL> shutdown immediate;2.SQL> startup mount;3.SQL> alter system enable restricted session;4.SQL> alter system set job_queue_processes=0;5.SQL> alter database open;6.SQL> alter database character set internal_use ZHS16GBK;7.SQL> shutdown immediate;8.SQL> startup;结果关闭没问题,但不能启动了,报错信息:Java代码1.SQL> startup nomount;2.ORA-01078: failure in processing system parameters3.LRM-00109: could not open parameter file '/home/oracle/oracle/product/10.2.0/db_3/dbs/initorcl.ora'把数据库实例对应目录下的复制过去也不行,终于找到解决方法,在运行上面命令前,先把系统环境变量做修改Java代码1.[oracle@localhost table_space]$ export ORACLE_SID=xxxx xxxx表示你的实例名即sid2.[oracle@localhost table_space]$ sqlplus /nolog3.4.SQL*Plus: Release 10.2.0.1.0 - Production on Wed Dec 14 12:29:48 20115.6.Copyright (c) 1982, 2005, Oracle. All rights reserved.7.8.SQL> conn / as sysdba9.Connected to an idle instance.10.SQL> startup mount;11.ORACLE instance started.12.13.Total System Global Area 603979776 bytes14.Fixed Size 1220796 bytes15.Variable Size 113250116 bytes16.Database Buffers 482344960 bytes17.Redo Buffers 7163904 bytes18.Database mounted.19.SQL>接下来继续剩余的操作,因为系统是32位的,创建个大表空间还是有些麻烦:Java代码1.create tablespace xxx datafile '/home/oracle/table_space/icms1.dat' SIZE 3G,2.'/home/oracle/table_space/icms2.dat' SIZE 3G,'/home/oracle/table_space/icms3.dat' SIZE 3G,3.'/home/oracle/table_space/icms4.dat' SIZE 3G,'/home/oracle/table_space/icms5.dat' SIZE 3G,4.'/home/oracle/table_space/icms6.dat' SIZE 3G,'/home/oracle/table_space/icms7.dat' SIZE 3G,5.'/home/oracle/table_space/icms8.dat' SIZE 3G,'/home/oracle/table_space/icms9.dat' SIZE 3G,6.'/home/oracle/table_space/icms10.dat' SIZE 3G,'/home/oracle/table_space/icms11.dat'SIZE 3G,7.'/home/oracle/table_space/icms12.dat' SIZE 3G,'/home/oracle/table_space/icms13.dat'SIZE 3G,8.'/home/oracle/table_space/icms14.dat' SIZE 3G,'/home/oracle/table_space/icms15.dat'SIZE 3G,9.'/home/oracle/table_space/icms16.dat' SIZE 3G,'/home/oracle/table_space/icms17.dat'SIZE 3G,10.'/home/oracle/table_space/icms18.dat' SIZE 3G,'/home/oracle/table_space/icms19.dat'SIZE 3G,11.'/home/oracle/table_space/icms20.dat' size 3g autoextend on next 1g maxsize unlimited;一次性做了60G的表空间,注意上面表空间的名称最好与dmp文件中涉及到的表空间一致,我之前就有类似提示警告,导致有些脚本不能正常执行。

医院信息系统Oracle数据库中导入数据中文乱码的解决技术

医院信息系统Oracle数据库中导入数据中文乱码的解决技术

90 ZHONGGUO YIXUEZHUANGBEI参考文献[4] [5] [6] [7] [8] [1] [2] [3] 黄伟,钱俊,鲍颖芳,等.以三甲综合医院为支撑的儿童专科医院发展模式分析[J].中国医院管理,2016,36(11):92-93.唐维维,吴飞,王虹.基于射频识别的住院病区药柜设计与实现[J].医疗卫生装备,2015,36(4):29-31. 梁雪萍,马存庆,梁颖升.一种快速检测RFID丢失标签的方法[J].计算机工程,2016,42(1):133-137.朱兆丰,杨骁俊,青科,等.基于RFID技术的多功能数字化医疗推车的研发[J].医疗装备,2016,29(1):10-12.孙绚.基于RFID的医疗设备使用状态监测系统分析[J].通讯世界,2016,10(1):218-219.徐涛,刘文.RFID技术在医疗设备质量控制管理中的应用[J].中国医疗设备,2011,26(4):33-35.董硕,白玫,严汉民.射频识别系统对医疗设备安全有效性的影响[J].中国医学装备,2016,13(1):126-128.王芳,李翔,李莎,等.基于RFID的医院冷链设备温度管理系统的设计与实现[J].中国药房,2015,6(13):1799-收稿日期:2016-06-15作者简介宫彦婷,女,(1973- ),硕士,副主任技师。

陆军总医院信息科,从事医院信息化系统的设计与应用的研究工作。

①陆军总医院信息科 北京 100700医院信息系统(hospital information system,HIS)已经成为保障医院正常运转的关键因素,其承载了医院门诊挂号收费、医生站、住院管理及检查检验等核心业务。

Oracle数据库是医院HIS系统的基础,其安全、稳定以及先进性将直接影响到医院的正常医疗活动,对保障医疗质量,提升工作效率具有重要作用[1-3]。

Oracle数据库在数据库升级或数据迁移时,通常选用导入导出实用程序,既可解决不同种或不同版本操作系统、不同版本数据库的数据移动,还可实现数据物理存储结构的重整[4]。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle 导入导出字符集乱码问题
导出/导入与字符集
进行数据的导入导出时,我们要注意关于字符集的问题。

在EXP/IMP过程中我们需要注意四个字符集的参数:导出端的客户端字符集,导出端数据库字符集,导入端的客户端字符集,导入端数据库字符集。

我们首先需要查看这四个字符集参数。

查看数据库的字符集的信息:
SQL> select * from nls_database_parameters;
PARAMETER VALUE
------------------------------
--------------------------------------------------------------------------------
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.7.4.1
NLS_CHARACTERSET:ZHS16GBK是当前数据库的字符集。

我的windows oracle编码为:
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET ZHS16GBK
我们再来查看客户端的字符集信息:
客户端字符集的参数NLS_LANG=_< territory >.
language:指定oracle消息使用的语言,日期中日和月的显示。

Territory:指定货币和数字的格式,地区和计算星期及日期的习惯。

Characterset:控制客户端应用程序使用的字符集。

通常设置或等于客户端的代码页。

或者对于unicode应用设为UTF8。

在windows中,查询和修改NLS_LANG可在注册表中进行:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\
xx指存在多个Oracle_HOME时的系统编号。

我这里的windows默认为:
windows Client:
NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK
在Linux redhat5中:
[oracle@ucit ~]$ cd 注意:cd 后是空格没有任何内容
[oracle@ucit ~]$ vi .bash_profile
加上:
export NLS_LANG="Simplified Chinese_China".ZHS16GBK 注意:四个端的参数编码要一致
然后使用:env|grep NLS_LANG看正确没有
在unix中:
$ env|grep NLS_LANG
NLS_LANG=simplified chinese_china.ZHS16GBK
修改可用:
$ export NLS_LANG=AMERICAN_AMERICA.UTF8
通常在导出时最好把客户端字符集设置得和数据库端相同。

当进行数据导入时,主要有以下两种情况:
(1) 源数据库和目标数据库具有相同的字符集设置。

这时,只需设置导出和导入端的客户端NLS_LANG等于数据库字符集即可。

(2) 源数据库和目标数据库字符集不同。

先将导出端客户端的NLS_LANG设置成和导出端的数据库字符集一致,导出数据,然后将导入端客户端的NLS_LANG设置成和导出端一致,导入数据,这样转换只发生在数据库端,而且只发生一次。

这种情况下,只有当导入端数据库字符集为导出端数据库字符集的严格超集时,数据才能完全导成功,否则,可能会有数据不一致或乱码出现。

不同版本的EXP/IMP问题
一般来说,从低版本导入到高版本问题不大,麻烦的是将高版本的数据导入到低版本中,在Oracle9i之前,不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决:
1、在高版本数据库上运行底版本的catexp.sql;
2、使用低版本的EXP来导出高版本的数据;
3、使用低版本的IMP将数据库导入到低版本数据库中;
4、在高版本数据库上重新运行高版本的catexp.sql脚本。

但在9i中,上面的方法并不能解决问题。

如果直接使用低版本EXP/IMP会
出现如下错误:
EXP-00008: orACLE error %lu encountered
orA-00904: invalid column name
这已经是一个公布的BUG,需要等到Oracle10.0才能解决,BUG号为2261722,你可以到METALINK上去查看有关此BUG的详细信息。

BUG归BUG,我们的工作还是要做,在没有Oracle的支持之前,我们就自己解决。

在Oracle9i中执行下面的SQL重建exu81rls视图即可。

Create or REPLACE view exu81rls
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spoli cy)
AS select , , r.pname, r.pfschma, r.ppname, r.pfname,
decode(bitand(r.stmt_type,1), 0,'', 'Select,')
|| decode(bitand(r.stmt_type,2), 0,'', 'Insert,')
|| decode(bitand(r.stmt_type,4), 0,'', 'Update,')
|| decode(bitand(r.stmt_type,8), 0,'', 'Delete,'),
r.check_opt, r.enable_flag,
DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)
from user$ u, obj$ o, rls$ r
er# = o.owner#
and r.obj# = o.obj#
and (uid = 0 or
uid = o.owner# or
exists ( select * from session_roles where
role='Select_CATALOG_ROLE')
)
/
grant select on sys.exu81rls to public;
/
可以跨版本的使用EXP/IMP,但必须正确地使用EXP和IMP的版本:
1、总是使用IMP的版本匹配数据库的版本,如:要导入到817中,使用817的IMP工具。

2、总是使用EXP的版本匹配两个数据库中最低的版本,如:从9201往817中导入,则使用817版本的EXP工具。

相关文档
最新文档