Oracle 导入导出字符集乱码问题
ORACLE乱码问题解决

'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中文乱码解决方法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数据库中文乱码的原因与解决

本文由我司收集整编,推荐下载,如有疑问,请与我司联系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导入出现字符集问题解决办法场景:把一台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 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。
它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
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汉字乱码问题原因及解决方法目录问题现象 (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中汉字的乱码问题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项⽬连接数据库,之后写了⼀个执⾏⼊库操作的模块。
此时暴露出⼀个问题就是项⽬的中⽂插⼊到数据库时会是乱码:
项⽬输出的中⽂:
执⾏插⼊操作后数据库中内容:
此时CustomerNumber字段是乱码。
出现这种情况⼀般都是数据库编码与项⽬编码不⼀致导致的,⾸先查看项⽬与数据库的编码格式:
查看项⽬编码:
项⽬的编码是gbk格式
查看数据库编码格式:
数据库编码格式是ISO-8859-1
以上查看编码格式操作可以百度
出现这种情况⼀般可以通过两种⽅式解决。
⼀是修改数据库或者项⽬的编码格式,⼆是对⼊库的中⽂进⾏编码转换。
第⼀种⽅式在项⽬初期可以这样搞,但是考虑到修改编码可能会影响其他模块的功能导致其他模块出现乱码。
所以我⼀般采⽤第⼆种⽅式。
转换编码后,⼊库中⽂乱码解决:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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工具。