查看Oracle字符集及如何修改字符集
oracle查询字符集语句分享
oracle查 询 字 符 集 语 句 分 享
(1)查看字符集(三条都是等价的)
复制代码 代码如ቤተ መጻሕፍቲ ባይዱ:
select * from v$nls_parameters where parameter='NLS_CHARACTERSET' select * from nls_database_parameters where parameter='NLS_CHARACTERSET' select * from props$ where name='NLS_CHARACTERSET'
(2)查看国家字符集(三条都是等价的) 复制代码 代码如下:
select * from nls_database_parameters where parameter='NLS_NCHAR_CHARACTERSET' select * from nls_database_parameters where parameter='NLS_NCHAR_CHARACTERSET' select * from props$ where name='NLS_NCHAR_CHARACTERSET'
--DataFile脱机 ALTER TABLESPACE BSS11 OFFLINE --作用对象:表空间BSS11的所有datafile ALTER DATABASE 'BSS_03.dbf' OFFLINE ---作用对象:BSS_03.dbf,就一个datafile
怎么查询Oracle的字符集_光环大数据推出AI智客计划送2000助学金
怎么查询Oracle的字符集_光环大数据推出AI智客计划送2000助学金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 -1awk '{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_LANGAMERICAN_AMERICA.ZHS16GBK如果检查的结果发现Server端与Client端字符集不一致,请统一修改为同Server端相同的字符集。
oracle字符集问题
oracle字符集问题应一直受服务端编码和客户端编码要一致误导,结果害了我半个小时时间,来解决这个小问题,现在把解决记录一下,以备忘记:出现中文乱码的主要原因是字符集不同。
在Oracle中,我们关心三个地方的字符集:先来查看一下数据库字符集:在Oracle中可能使用Select userenv('language') from dual;或者:Select name, value$ from props$;查看。
l Oracle服务器内部的字符集修改方法:connect sys/chang_on_installupdate props$set value$='TRADITIONAL CHINESE_TAIWAN.AL32UTF8'wherename='NLS_CHARACTERSET';commit;2 NLS_LANG变量里保存的字符集这个是Oracle设置的一个变量。
在Windows中,这个变量保存在注册表中:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 保存着NLS_LANG变量。
在Unix/Linux中,则需要自己进行设置,在.profile里面加上NLS_LANG=AMERICAN_AMERICA.ZHS16GBKexport NLS_LANG3 客户端应用的字符集下面是我用到的字符集american_america.AL32UTF8TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950TRADITIONAL CHINESE_TAIWAN.AL32UTF8AMERICAN_AMERICA.WE8ISO8859P1AMERICAN_AMERICA.ZHS16GBK特别注意:如果服务端编码为AL32UTF8,那么客户端就应该安装自己环境来设置字符编码。
比如我有一个服务器端,其中两个客户端一个为简体,一个为繁体:服务器端字符集设置:american_america.AL32UTF8简体客户端字符集设置:AMERICAN_AMERICA.ZHS16GBK繁体客户端字符集设置:TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950。
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. ZHS16GBK2、如何查询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也可以得到它对应的字符集。
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的字符集命名遵循以下命名规则:<Language><bit size><encoding>即: <语言><比特位数><编码>比如: 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为每一个字符提供唯一的编码。
Oracle导出导入与字符集信息查看
Oracle导出导入与字符集信息查看Oracle导出/导入与字符集信息查看进行数据的导入导出时,我们要注意关于字符集的问题。
在EXP/IMP过程中我们需要注意四个字符集的参数:导出端的客户端字符集,导出端数据库字符集,导入端的客户端字符集,导入端数据库字符集。
我们首先需要查看这四个字符集参数。
查看数据库的字符集的信息:SQL> select * from nls_database_parameters;PARAMETER VALUE------------------------------ --------------------------------------------------------------------------------NLS_LANGUAGE AMERICANNLS_TERRITORY AMERICANLS_CURRENCY $NLS_ISO_CURRENCY AMERICANLS_NUMERIC_CHARACTERS .,NLS_CHARACTERSET ZHS16GBKNLS_CALENDAR GREGORIANNLS_DATE_FORMAT DD-MON-RRNLS_DATE_LANGUAGE AMERICANNLS_SORT BINARYNLS_TIME_FORMAT HH.MI.SSXFF AMNLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AMNLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZMNLS_DUAL_CURRENCY $NLS_COMP BINARYNLS_NCHAR_CHARACTERSET ZHS16GBKNLS_RDBMS_VERSION 8.1.7.4.1NLS_CHARACTERSET:ZHS16GBK是当前数据库的字符集。
Oracle数据库字符集修改的方法
ORACLE数据库字符集修改的方法ORACLE数据库有国家字符集(national character set)与数据库字符集(database character set)之分。
两者都是在创建数据库时需要设置的。
国家字符集主要是用于NCHAR、NVARCHAR、NCLOB类型的字段数据,而数据库字符集应用于:CHAR、VARCHAR、CLOB、LONG类型的字段数据;表名、列名、PL/SQL中的变量名;输入及保存在数据库的SQL和PL/SQL的源码。
具体分析:字符集修改主要有两种方法:方法一:通过逻辑备份导入导出的方法实现方法二:通过alter database set …修改以上两种两方法各有优劣,下面我们通过各自实现的方法来实现字符集的转换,来说明各自特点。
例:把当前字符集ZHS16GBK 改变成UTF8在字符集转换过程中经常会出字符长度规则不一样,这样会引起数据无法导入或者出现乱码。
我们可以通过ORACLE提供的工具检查及根据建议修改。
在SYS用户执行@?/rdbms/admin/csminst.sql脚本后:$ csscan FULL=Y FROMCHAR=ZHS16GBKfromnchar=AL32UTF8TOCHAR=UTF8 TONCHAR=UTF8 ARRAY=1024000LOG=charcheckCAPTURE=Y PROCESS=4;FROMCHAR:说明数据库CHAR, VARCHAR2, LONG,CLOB数据类型的实际字符集,缺省使用数据库的字符集。
FROMNCHAR:说明数据库NCHAR, NVARCHAR2, NCLOB数据类型的实际国家字符集,缺省使用数据库的国家字符集。
TOCHAR:指定需要转换的目标字符集。
TONCHAR:指定需要转换的目标国家字符集,如果未指定将不扫描NCHAR, NVARCHAR2, NCLOB数据类型的数据。
执行完上述指令后,检查输出charcheck.err文件并根据建议修改表段长度:User : SFEHRTable : ATMP_DEPTColumn: MEMOType : VARCHAR2(100)Number of Exceptions : 10Max Post Conversion Data Size: 130ROWID Exception Type Size Cell Data(first 30 bytes)------------------ ------------------ ----- ------------------------------AAANhYAAMAAAAA0AAg exceed column size 102 此点部于2006年7月1日由清凉点部AAANhYAAMAAAAA3ABD exceed column size 119 原来的容桂点部06年7月1日起,拆AAANhYAAMAAAAA5AAb exceed column size 116 沙田点部归属原由虎门分部直接管AAANhYAAMAAAAA5ABF exceed column size 130 2004年04月01日开始正式合併入85AAANhYAAMAAAAA8AAn exceed column size 119 大岭山点部归属莞城分部管理。
oracle修改字符集为ALU32UTF8
Variable Size 201326592 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
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
Database altered.
SQL> ALTER DATABASE character set INTERNAL_USEAL32UTF8; Database altered.
oracle修改字符集toUTF8
oracle数据库字符集的修改(改Oracle字符集到utf-8为例)标签:oracle数据库databasecharacter服务器system2011-06-27 20:59 21580人阅读评论(0) 收藏举报分类:Oracle Management(10)作者同类文章X版权声明:本文为博主原创文章,未经博主允许不得转载。
1、改客户端字符集:通过WINDOWS的运行菜单运行Regedit,修改注册表Start -> Run -> Rededit <-|Under registry Editor - > HKEY_LOCAL_MACHINE -> SOFTWARE->ORACLE->KEY_XE->RIGHT WINDOW DOUBLE CLICK NLS_LANG -> CHANGE VALUE TO "AMERICAN_AMERICA.UTF8" ->OK ->CLOSE REGISTRY正确设置ORACLE客户端字符集的方法:oracle客户端字符集设置需要和服务器端一致,否则会出现乱码问题。
首先连接服务器,查询服务器端设置:select * from v$nls_parameters;找到:NLS_LANGUAGENLS_TERRITORYNLS_CHARACTERSET环境变量nls_lang便是由这三部分组成NLS_LANG = language_territory.charset比如:NLS_LANG = American_Japan.JA16SJIS2、改服务器端字符集,通过ORACLE的SQL PLUS命令窗口改在SQL*PLUS 中,以DBA登录conn 用户名as sysdba然后执行以下命令>shutdown immediate; (把database停了)>startup mount; (把database重开去可更改情況)>alter system enable restricted session;>alter system set job_queue_processes=0;>alter system set aq_tm_processes=0;>alter database open;>alter database character set utf8;OR>alter database character set internal_use utf8; >shutdown immediate;>startup; (重开正常oracle)。
oracle查看字符集后修改oracle服务端和客户端字符集的步骤
oracle查看字符集后修改oracle服务端和客户端字符集的步骤1.复制代码代码如下:select userenv('language') from dual;:将数据库启动到RESTRICTED模式下做字符集更改:复制代码代码如下:SQL>conn /as sysdbaSQL>shutdown immediate;SQL>startup mountSQL>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;ALTER DATABASE CHARACTER SET ZHS16GBK ERROR at line 1:ORA-12712: new character set must be a superset of old character set提⽰我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:复制代码代码如下:SQL>ALTER DATABASE character set INTERNAL_USE ZHS16GBK;SQL>select * from v$nls_parameters;重启检查是否更改完成:复制代码代码如下:SQL>shutdown immediate;SQL>startupSQL>select * from v$nls_parameters;我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE 提供的帮助就是使Oracle数据库绕过了⼦集与超集的校验这⼀⽅法在某些⽅⾯是有⽤处的,⽐如测试;应⽤于产品环境时⼤家应该⼩⼼,可能会有⼀些意外的问题。
oracle字符集问题
oracle字符集问题一般可以分为三类:数据库字符集(NLS_CHARACTERSET)、国家字符集(NLS_NCHAR_CHARACTERSET), sqlplus的字符集(客户端字符集), 终端程序的字符集(非oracle的)。
1、数据库字符集。
数据库字符集是所有字符问题的核心,只有数据库本身的字符集正确了,客户端的字符集才可能正确。
这里指的客户端包括sqlplus以及我们自己读数据库的应用程序。
在定位问题时,我们需要先看看数据库当前是什么字符集。
1)查询数据库字符集select * from nls_database_parameters其中nls_language表示了显示方式, 就是sqlplus的程序的显示字体,有SIMPLIFIED CHINESE,American america其中nls_characterset是字符集设定, 常用的一些字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF82)修改数据库字符集当发现数据库字符集不正确时,如我们期望时GBK的,而数据库当前是其他的,从而引起中文乱码。
这时我们需要修改数据库字符集。
步骤如下:$sqlplus /nologSQL>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 CHARACTER SET INTERNAL_USE ZHS16GBK;SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK; -- 设置国家字符集SQL>SHUTDOWN IMMEDIATE;SQL>STARTUP2 客户端字符集如果服务器端的字符集是正确的,而在客户端下,如sqlplus仍然不能正确显示中文,这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。
如何查看及修改oracle编码格式方法
database closed.
database dismounted.
oracle instance shut down.
sql> startup mount;
oracle instance started.
total system global area 135337420 bytes
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 databa JA16SJIS;
sql> shutdown immediate;
sql> startup;
如何查看及修改oracle编码格式方法
查看oracle数据库字符集:
select userenv('language') from dual;
查询结果:
SIMPLIFIED CHINESE_CHINA.AL32UTF8
--修改oracle数据库字符集:(在SQL Plus中)
sql> conn / as sysdba;
fixed size 452044 bytes
variable size 109051904 bytes
database buffers 25165824 bytes
[原创]查看与修改oracle数据库字符集
[原创]查看与修改oracle数据库字符集NLS_LANG参数格式NLS_LANG=<language>_<territory>.<client character set>Language:显⽰oracle消息,校验,⽇期命名Territory:指定默认⽇期、数字、货币等格式Client character set:指定客户端将使⽤的字符集例如:NLS_LANG=AMERICAN_AMERICA.ZHS16GBKAMERICAN是语⾔,AMERICA是地区,ZHS16GBK是客户端字符集1. 查看服务器端字符集:视图 "nls_database_parameters" 来源于props$,是表⽰数据库的字符集。
props$是创建数据库时存储在数据库中的信息。
select * from nls_database_parameters where parameter in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');select userenv('language') from dual;// ⽰例SQL> select userenv('language') from dual;USERENV('LANGUAGE')----------------------------------------------------SIMPLIFIED CHINESE_CHINA.ZHS16GBKSQL>2. 查看实例字符集:视图 "nls_instance_parameters" 来源于v$nls_parameters,表⽰会话⾃⼰的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters⼀致。
oracle19c修改编码
oracle19c修改编码在Oracle 数据库中,修改数据库编码(字符集)是一个复杂的过程,需要小心操作以确保数据的完整性。
以下是大致的步骤,但请注意在执行这些步骤之前,强烈建议在生产环境中进行充分的备份,并在非生产环境中测试这些步骤。
步骤1: 检查当前字符集在执行修改操作之前,首先检查当前数据库的字符集。
你可以使用以下查询来获取当前数据库字符集的信息:```sqlSELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';```步骤2: 导出数据在修改字符集之前,建议将数据库中的数据导出为SQL 文件,以便在需要时进行还原。
使用`exp` 或`expdp` 工具导出数据。
```bashexp userid=your_username/your_password@your_database file=export_data.dmp```或```bashexpdp userid=your_username/your_password@your_database dumpfile=export_data.dmp```步骤3: 停止数据库在修改字符集之前,需要停止数据库服务。
步骤4: 修改字符集1. **修改`init.ora` 文件:**找到Oracle 数据库的`init.ora` 配置文件,通常位于`$ORACLE_HOME/dbs` 目录下。
编辑该文件,将`NLS_CHARACTERSET` 参数的值修改为目标字符集。
例如:```plaintextNLS_CHARACTERSET = AL32UTF8```请确保你了解目标字符集的选择,以防止数据损坏。
2. **修改`ALTER DATABASE` 命令:**在SQL*Plus 或其他管理工具中执行以下命令:```sqlSTARTUP 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 CHARACTER SET AL32UTF8; --将AL32UTF8 替换为目标字符集```步骤5: 重新编译对象执行以下脚本重新编译数据库中的所有对象:```sql@?/rdbms/admin/utl32k.sql@?/rdbms/admin/utlrp.sql```步骤6: 重建索引由于字符集的改变可能导致索引无效,重新构建索引是一个必要的步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
查看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. ZHS16GBK2、如何查询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_LANGAMERICAN_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 /nologSQL>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 到ZHS16GBKSHUTDOWN 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 ;。