文档库 最新最全的文档下载
当前位置:文档库 › 查看Oracle字符集及如何修改字符集

查看Oracle字符集及如何修改字符集

查看Oracle字符集及如何修改字符集
查看Oracle字符集及如何修改字符集

查看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 dua l;

结果类似如下: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主机上):

catexp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

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

3、查询oracle client端的字符集

这个比较简单。

在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如: setnls_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无法打开,就需要用程序的方法了

安装时采用什么字符集主要看你的需求,一般测试用的话,就用UTF8.

后面可以修改,

10g:UTF8 到ZHS16GBK

SHUTDOWN IMMEDIATE;

STARTUP MOUNT ;

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

ALTER DATABASE NATIONAL CHARACTER SET AL16UTF16; 更改国际字符集===========

ALTER DATABASE CHARACTER SET ZHS16GBK; 更改本地字符集

或者

ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

===========

SHUTDOWN IMMEDIATE;

STARTUP ;

ORACLE字符集

Oracle 的字符集 1、字符集基本概念 Character set 字符集是某系统支持的所有抽象字符(各种文字和符号的总称)的集合,包括各国家文字、标点、图形、数字等。Oracle字符集命名规则: <语言><比特位数><编码> ZHS16GBK表示采用GBK编码格式、16bit、简体中文字符集. Character Encoding 字符编码指怎么将字符变成字节用于保存、读取和传输。 单字节编码 单字节7位字符集,可定义128个字符,最常用的为US7ASCII,oracle最早支持的编码方案 单字节8位字符集,可定义256个字符,适合欧洲大部分国家 WE8ISO8859P1(西欧、8位) 多字节编码 变长多字节编码,某些字符用一个字节,某些字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持例如日语、汉语、印语等。AL32UTF8(AL 代表ALL,指适用于所有地区)、zhs16cgb231280 定长多字节编码,每一个字符都使用固定长度字节的编码方案,目前oracle 唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集。

Unicode 字符集 几乎包含人类所有可用的字符,每年还在不断的增加,可以看作是一种通用的字符集。它将全世界所有的字符统一化,统一编码,不会再出现字符不兼容和字符转换的问题。 UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符。 UTF-8 是unicode 的8 位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集 字符集超级 当一种字符集A的编码数值包含所有另一种字符集B的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级或称字符集B是字符集A的子集。Oracle8i和oracle9i官方文档资料中有子集-超级对照表(subset-superset pairs)例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式因此有许多字符集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。 2、Oracle字符集基本原理 Oracle 通过NLS_LANG=language_territory.charset 设定对语言和字符集的支持,如AMERICAN_AMERICA.AL32UTF8,其实真正影响数据库字符集是第三部分。两个数据库的NLS_LANG只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。在一个创建好的数据库中这个参数是分部分存

修改oracle字符集

测试的时候,本机oracle安装采用了utf8字符集,而项目的要求是gbk 字符集,为了防止以后有不同字符集数据信息导入导出的问题,整理以下文档。 修改oracle字符集新装了oracle,装为AL32UTF8格式,无奈一个工程导出包是ZHS16GBK格式,想了想办法转换,以下是学习 一、什么是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 (本机结果SIMPLIFIED CHINESE_CHINA.AL32UTF8) 2、如何查询dmp文件的字符集

搞懂oracle字符集

搞懂oracle字符集 作为一个ORACLE DBA,在工作中会经常处理由于字符集产生的一些问题。但是当真正想写一些这方面的东西时,却突然又没有了头绪。发了半天呆,还是决定用两个字符集方面的例子作为切入点,倒不失为一个头绪,说不定在实验的过程中,问题就会一个接着一个的浮现出来。 现在,让我们切入正题。 我用的数据库是oracle10.2.0.3,数据库字符集是al32utf8。 客户端就是同一台机器的windows xp. 下面是演示的例子: SQL>drop table test purge; Table dropped. SQL>create table test(col1number(1),col2varchar2(10)); Table created. --session1设置客户端字符集为zhs16gbk(修改注册表nls_lang项的characterset为zhs16gbk)向表中插入两个中文字符。 SQL>insert into test values(1,'中国');--1为session1的标记 1row created. SQL>commit; Commit complete. --session2设置客户端字符集al32utf8(修改注册表nls_lang项的characterset为al32utf8),与数据库字符集相同。向表中插入两个和session1相同的中文字符。 SQL>insert into test values(2,'中国');--2为session2的标记 1row created. SQL>commit; Commit complete. --session1 SQL>select*from test; COL1COL2 ------------------------------ 2??? 1中国

查看Oracle字符集及如何修改字符集

查看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 dua l; 结果类似如下: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主机上): catexp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6 然后用上述SQL也可以得到它对应的字符集。 3、查询oracle client端的字符集 这个比较简单。 在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如: setnls_lang=AMERICAN_AMERICA.ZHS16GBK 这样就只影响这个窗口里面的环境变量。

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

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 修改字符集为ALU32UTF8

oracle 修改字符集 ZHS16GBK修改为AL32UTF8 oracle server 端字符集查询 selectuserenv('language') from dual 修改步骤如下面粗体字的命令: SQL> SQL> conn /as sysdba Connected. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 236000356 bytes Fixed Size 451684 bytes Variable Size 201326592 bytes Database Buffers 33554432 bytes Redo Buffers 667648 bytes Database mounted. SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

System altered. SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; System altered. SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; System altered. SQL>alter database open; Database altered. SQL> ALTER DATABASE character set INTERNAL_USE AL32UTF8; Database altered. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 236000356 bytes Fixed Size 451684 bytes Variable Size 201326592 bytes Database Buffers 33554432 bytes Redo Buffers 667648 bytes Database mounted. Database opened.

Oracle服务端与客户端字符集

Oracle客户端与服务端字符集 Oracle 数据库对字符的处理及表现形式分为三个层面,优先级先后分别是数据库初始化参数字符集、OS操作系统环境变量级、session级。 数据库初始化参数字符集是在建数据库前指定的字符集,使用如下语句查询数据库字符集: SQL> select userenv('language') from dual; USERENV('LANGUAGE') ---------------------------------------------------- AMERICAN_AMERICA.ZHS16GBK 完整字符集名称分为三部分:语言_地域.字符集,这里以 AMERICAN_AMERICA.ZHS16GBK 和SIMPLIFIED CHINESE_CHINA.ZHS16GBK 为例说明各部分的含义: 语言决定了提示信息使用的语言,如AMERICAN表示使用英语,SIMPLIFIED CHINESE表示使用简体中文; 地域决定了缺省的日期格式等,如: AMERICA的时间格式为: SQL>select sysdate from dual; SYSDATE ------------ 20-AUG-12 CHINA的时间格式为: SQL>select sysdate from dual; SYSDATE --------------

20-8月-12 字符集的格式为<语言><比特位数><编码>比如: ZHS16GBK表示采用GBK 编码格式、16位(两个字节)简体中文字符集。 数据库建立后字符集原则上不要修改,如果修改可以用命令alter database set character set xxx; 不过这样修改有一定的危险,有可能会出现乱码造成数据的丢失,而且修改后的字符集一定是修改前字符集的超集,修改数据库字符集一般采用两种方法: 1.导出数据库数据,重建数据库,再导入数据库数据的方式来转换。 2.通过ALTER DATABASE CHARACTER SET语句修改字符集,具体操作 如下: 1)关闭数据库 SQL>SHUTDOWN IMMEDIATE 2)启动到Mount 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 注:启动数据库后应将有改动的JOB_QUEUE_PROCESSES、AQ_TM_PROCESSES等参数修改为原有值。 NLS_CHARACTERSET设置服务器的字符集。 NLS_LANG客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用。如:当某客户端的NLS_LANG配置的字符集为:SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280,但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.ZHS16GBK export NLS_LANG 客户端应用的字符集 Oracle客户端使用比较多的是PLSQL Developer 当然目前plsql客户端还不能很好的支持64为的Oracle 当然可以下载Oracle官方的客户端再通过关联可以使用plsql连接上64位的Oracle数据库,这与本文主题略有偏离便不详细描述了。 如果 Oracle服务器内部的字符集和 NLS_LANG变量里保存的字符集相同,在进行Oracle查询时,就会将Oracle中的数据直接查出来,返回给查询用户。进行Oracle的插入操作,就会直接将插入的数据保存进数据库中。 但是如果不同的话,Oracle查询时,会根据这两个字符集的一个映射,将数据库中的数据作一个转换,再返回给查询用户。进行插入操作时,也会根据映射,将插入的数据作一个转换,再插入数据库。这也是产生乱码的原因,这一层转换,把数据都给转乱了。

Oracle数据库字符集的查询

Oracle数据库字符集的查询 Oracle数据库字符集通俗的讲就是一个字节数据的相关的解释的符号集合,它具有大小的差异,也有互相包容关系。Oracle是支持国家语言的相关体系结构,它允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中: Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK。 从NLS_LANG的组成我们可以看出,真正影响Oracle数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。 如何查询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

Oracle 字符集的查看和修改

Oracle 字符集的查看和修改 一、什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响Oracle数据库字符集最重要的参数是NLS_LANG参数。 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。 其中: Language:指定服务器消息的语言,影响提示信息是中文还是英文Territory:指定服务器的日期和数字格式, Charset:指定字符集。 如:AMERICAN _ AMERICA. ZHS16GBK 从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。 所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。 二.字符集的相关知识: 2.1 字符集 实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。 Oracle的字符集命名遵循以下命名规则: 即: <语言><比特位数><编码> 比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集

2.2 字符编码方案 2.2.1 单字节编码 (1)单字节7位字符集,可以定义128个字符,最常用的字符集为US7ASCII (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码) 2.2.2 多字节编码 (1)变长多字节编码 某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,例如日语、汉语、印地语等 例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、zhs16cgb231280 (2)定长多字节编码 每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集 2.2.3 unicode编码 Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符,AF16UTF16是UTF-16编码字符集。 UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集 2.3 字符集超级 当一种字符集(字符集A)的编码数值包含所有另一种字符集(字符集B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级,或称字符集B是字符集A的子集。 Oracle8i和oracle9i官方文档资料中备有子集-超级对照表(subset-superset pairs),例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式,因此有许多字符集是US7ASCII的超集,例如 WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。 2.4 数据库字符集(oracle服务器端字符集) 数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。

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文件的字符集。在做数据导入的时候,需要这三个字符集都一致才能正确导入。查询oracle server端的字符集有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:SQL>select userenv(‘language’) from dual; 结果类似如下:AMERICAN _ AMERICA. ZHS16GBK 对于查询工具结果集中的中文乱码,其实有两种情况供参考: 1.安装了服务器及配套工具,这样还出现乱码就去检查注册表中的NLS_LANG项是否设置正确,很有可能是在安装时设置了不正确的字符集造成的; 2.只安装了客户端,没有配套工具(如sqlplus等),以10g为例,注册表中是没有NLS_LANG 这项的,那么要改哪?同理,还是要改字符集,不过不是在注册表中设,是要在环境变量中增加或修改,即查看windows系统环境变量是否存在NLS_LANG,若存在则修改,若不存在新建,将值设为服务器端的字符集,服务器端的字符集可以通过上面的方法查询。 也可以硬性修改服务器端字符集但是不推荐,因为这可能会造成意想不到的问题。 修改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

oracle 字符集查看与修改

oracle 字符集查看与修改 oracle 字符集查看与修改 原文:https://www.wendangku.net/doc/3c2348640.html,/8475224/viewspace-692675 一、什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响Oracle数据库字符集最重要的参数是NLS_LANG参数。 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。 其中: Language:指定服务器消息的语言,影响提示信息是中文还是英文 Territory:指定服务器的日期和数字格式, Charset:指定字符集。 如:AMERICAN _ AMERICA. ZHS16GBK 从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。 所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。 二.字符集的相关知识: 2.1字符集 实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。 Oracle的字符集命名遵循以下命名规则: 即: <语言><比特位数><编码> 比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集 2.2字符编码方案 2.2.1单字节编码 (1)单字节7位字符集,可以定义128个字符,最常用的字符集为US7ASCII (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家 例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码) 2.2.2多字节编码 (1)变长多字节编码 某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,例如日语、汉语、印地语等 例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、zhs16cgb231280 (2)定长多字节编码

Oracle gb2312 字符集 转 utf-8

最近因为一些特殊的需求,考虑到以后系统的开发, 就把现有Oracle数据库的字符集gb2312改为了UTF-8 步骤: 1.在SQL*PLUS 中,以DBA登录 conn 用户名as sysdba 2.执行转换语句: SHUTDOWN IMMEDIATE; STARTUP MOUNT EXCLUSIVE; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE NATIONAL CHARACTER SET UTF8; ALTER DATABASE character set INTERNAL_USE ZHS16GBK; SHUTDOWN immediate; startup; 注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start) 按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 这样的提示信息 要解决这个问题有两种方法 一个是,利用INTERNAL_USE 关键字修改区域设置, 还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use, SHUTDOWN IMMEDIATE; STARTUP MOUNT EXCLUSIVE; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8; SHUTDOWN immediate; startup; 查询字符集 ---------set NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL16UTF16" select * from sys.props$; AL16UTF16 与UTF8可以互换

oracle数据库字符集修改

1.修改服务器端oracle默认字符集:打开“开始菜单”,在“运行”里输入“cmd”,回车,进入命令行编辑模式。输入“sqlplus /nolog”,回车。要修改默认字符集,必须以sysdba的身份执行SQL语句。输入“conn sys/password@orcl as sysdba;”,回车。输入“select name,value$ from props$ where name like ’%NLS%’;”,查看默认字符集。找到“NLS_CHARACTERSET”,其值为“WE8ISO8859P1”。再执行【注意区分大小写】“update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';”,输入“select name,value$ from props$ where name like ’%NLS%’;”,找到“NLS_CHARACTERSET”,看其值是否更新为“ZHS16GBK”。如果已更新,则表明更改成功。然后需要关闭数据库,重新启动数据库。 2.修改客户端sqlplus默认字符集:打开“开始菜单”,在“运行”里输入“regedit”,回车,进入注册表编辑器。按CTRL+F,输入“NLS_LANG”,回车,找到sqlplus软件目录下的NLS_LANG,其键值为“WE8ISO8859P1”。双击“NLS_LANG”,输入“ZHS16GBK”,点击“确定”按钮保存。然后重启计算机。问题应该得到解决了。 ----------------------------------------------------------------------------------------------------------------------------------------------------------- 将数据库启动到RESTRICTED模式下做字符集更改: SQL> sqlplus /nolog SQL> conn /as sysdba Connected. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 236000356 bytes Fixed Size 451684 bytes Variable Size 201326592 bytes Database Buffers 33554432 bytes Redo Buffers 667648 bytes Database mounted. SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; System altered. SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; System altered. SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; System altered. SQL> alter database open; Database altered. SQL> ALTER DATABASE CHARACTER SET ZHS16GBK; ALTER DATABASE CHARACTER SET ZHS16GBK * ERROR at line 1: ORA-12712: new character set must be a superset of old character set

Oracle 字符集的查看和修改

一、什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响Oracle数据库字符集最重要的参数是NLS_LANG参数。 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。 其中: Language:指定服务器消息的语言,影响提示信息是中文还是英文Territory:指定服务器的日期和数字格式, Charset:指定字符集。 如:AMERICAN _ AMERICA. ZHS16GBK 从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。 所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。 二.字符集的相关知识: 2.1 字符集 实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。 Oracle的字符集命名遵循以下命名规则: 即: <语言><比特位数><编码> 比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中

文字符集 2.2 字符编码方案 2.2.1 单字节编码 (1)单字节7位字符集,可以定义128个字符,最常用的字符集为US7ASCII (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家 例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码) 2.2.2 多字节编码 (1)变长多字节编码 某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,例如日语、汉语、印地语等 例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、 zhs16cgb231280 (2)定长多字节编码 每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集 2.2.3 unicode编码 Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode 的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode 字符,AF16UTF16是UTF-16编码字符集。 UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集

相关文档
相关文档 最新文档