oracle 字符集查看与修改
- 格式:docx
- 大小:26.78 KB
- 文档页数:8
Oracle和plsqldeveloper编码设置 在使⽤pl/sql developer时,查询出来中⽂字段显⽰乱码,因为数据库的编号格式和pl /sql developer的编码格式不统⼀造成的。
⼀、查看和修改oracle数据库字符集select userenv('language') from dual;--查询结果:SIMPLIFIED CHINESE_CHINA.AL32UTF8--修改oracle数据库字符集:(在SQL Plus中)sql> conn / as sysdba;sql> shutdown immediate;database closed.database dismounted.oracle instance shut down.sql> startup mount;oracle instance started.total system global area 135337420 bytesfixed size 452044 bytesvariable size 109051904 bytesdatabase buffers 25165824 bytesredo buffers 667648 bytesdatabase 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 JA16SJIS;sql> shutdown immediate;sql> startup;⼆、修改pl/sql developer 的编码 在windows中创建⼀个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,然后重新启动pl/sql developer,这样检索出来的中⽂内容就不会是乱码了。
怎么查询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 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。
它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
影响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也可以得到它对应的字符集。
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字符集查看服务器端字符集几种命令语句:SQL>select userenv("lanaugure") from dual; SQL>select * from v$nls_parameters; SQL>select * from nls_database_parameters; SQL>select * from sys.props$; 修改服务器端字符集(用sys用户):方法一:首先执行:update props$ set value$ = 'WE8ISO8859P1' where name ='NLS_CHARACTERSET'; update props$ set value$ = 'china' where name ='NLS_LANGUAGE'; 提交(commit),然后,重新启动数据库;用客户端工具(PL/SQL DEVELOP or PB etc.)查询数据库,若显示乱码,先查询出数据库端的字符集,然后,从注册表中修改NLS_LANG字段的值,可能为AMERICAN_AMERICA.WE8ISO8859P1或者SIMPLIFIED CHINESE_CHINA.ZHS16GBK 或者NA等。
方法二:alter system enable restricted session; alter database ORCL character set ZHS16GBK; alter database ORCL national character set ZHS16GBK; 主流的字符集种类WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK-----ORACLE数据库字符集详细介绍一.引言ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储、处理和检索数据。
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中可能使用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导出/导入与字符集信息查看进行数据的导入导出时,我们要注意关于字符集的问题。
在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数据库有国家字符集(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 大岭山点部归属莞城分部管理。
selectuserenv('language') from dual;SELECT * FROM PROPS$;NLS_CHARACTERSET AL32UTF8对于简体中文平台,缺省的字符集是:ZHS16GBK常见的中文字符集有:ZHS16CGB231280 CGB2312-80 16-bit Simplified Chinese MB, ASCII ZHS16GBK GBK 16-bit Simplified Chinese MB, ASCII, UDC其中GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。
新加坡等地也使用此编码。
GBK编码是1995年12月颁布的指导性规范。
GBK与国家标准GB 2312-80 信息处理交换码所对应的、事实上的内码标准兼容;同时,在字汇一级支持ISO/IEC 10646-1 和GB 13000-1 的全部中日韩(CJK) 汉字(20902字)。
包含了更多的编码。
但是我们说,ZHS16GBK 并非是ZHS16CGB231280的严格超集(虽然后者的汉字在前者中都存在,但是同样的编码在不同两个字符集中可能表达不同的汉字),所以在做数据库字符转换时仍然需要特别注意。
Oracle的字符集命名遵循以下命名规则:<Language><bit size><encoding>即: <语言><比特位数><编码>比如: ZHS · 16·GBK需要说明的是,有些字符集命名违背了这个规范,Oracle8/Oralce8i中的UTF-8是第一个打破这个命名规范的字符集。
我们可以看到一类字符集以AL开头,如:AL16UTF16其中AL代表ALL,指适用于所有语言(All Languages),按照这个标准当年UTF-8本应被命名为AL24UTF8。
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字符集编码Oracle是一种流行的关系型数据库管理系统,它支持多种字符集编码。
在处理多语言数据时,正确的字符集编码非常重要。
本文将介绍如何查看Oracle字符集编码。
1. 查看数据库字符集编码要查看Oracle数据库的字符集编码,可以使用以下SQL语句:SELECT * FROM nls_database_parameters WHEREparameter='NLS_CHARACTERSET';这将返回一个结果集,其中包含数据库的字符集编码。
2. 查看表的字符集编码要查看特定表的字符集编码,可以使用以下SQL语句:SELECT * FROM all_tab_columns WHEREtable_name='table_name' AND column_name='column_name';将“table_name”和“column_name”替换为要查询的表和列名称。
这将返回一个结果集,其中包含表的字符集编码。
3. 查看会话字符集编码要查看当前会话的字符集编码,可以使用以下SQL语句:SELECT * FROM nls_session_parameters WHEREparameter='NLS_CHARACTERSET';这将返回一个结果集,其中包含当前会话的字符集编码。
4. 修改字符集编码如果需要修改Oracle数据库的字符集编码,需要执行以下步骤:a. 停止数据库实例。
b. 备份数据库。
c. 修改数据库参数文件(init.ora或spfile)中的NLS_CHARACTERSET参数。
d. 启动数据库实例。
e. 使用ALTER DATABASE CHARACTER SET语句修改数据库中现有表和列的字符集编码。
f. 重新创建索引和约束。
g. 修改应用程序以使用新的字符集编码。
总结在处理多语言数据时,正确的字符集编码非常重要。
[原创]查看与修改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修改编码在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: 重建索引由于字符集的改变可能导致索引无效,重新构建索引是一个必要的步骤。
oracle 字符集查看与修改oracle 字符集查看与修改原文:/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的字符集命名遵循以下命名规则:<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.3unicode编码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)。
2.4.1字符集(1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据(2)用来标示诸如表名、列名以及PL/SQL变量等(3)用来存储SQL和PL/SQL程序单元等2.4.2国家字符集:(1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据(2)国家字符集实质上是为oracle选择的附加字符集,主要作用是为了增强oracle的字符处理能力,因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。
国家字符集在oracle9i中进行了重新定义,只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AF16UTF162.4.3查询字符集参数可以查询以下数据字典或视图查看字符集设置情况nls_database_parameters、props$、v$nls_parameters查询结果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示国家字符集2.4.4修改数据库字符集按照上文所说,数据库字符集在创建后原则上不能更改。
不过有2种方法可行。
1.如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换。
2.通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。
2.5客户端字符集(NLS_LANG参数)2.5.1客户端字符集含义客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus,exp/imp等。
客户端字符集是通过设置NLS_LANG参数来设定的。
2.5.2NLS_LANG参数格式NLS_LANG=<language>_<territory>.<client character set>Language:显示oracle消息,校验,日期命名Territory:指定默认日期、数字、货币等格式Client character set:指定客户端将使用的字符集例如:NLS_LANG=AMERICAN_7ASCIIAMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集2.5.3客户端字符集设置方法1)UNIX环境$NLS_LANG=“simplified chinese”_china.zhs16gbk$export NLS_LANG编辑oracle用户的profile文件2)Windows环境编辑注册表Regedit.exe ---》HKEY_LOCAL_MACHINE ---》SOFTWARE ---》ORACLE-HOME2.5.4NLS参数查询Oracle提供若干NLS参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通过查询以下数据字典或v$视图查看。
NLS_DATABASE_PARAMETERS:显示数据库当前NLS参数取值,包括数据库字符集取值NLS_SESSION_PARAMETERS:显示由NLS_LANG设置的参数,或经过alter session改变后的参数值(不包括由NLS_LANG设置的客户端字符集)NLS_INSTANCE_PARAMETE:显示由参数文件init<SID>.ora定义的参数V$NLS_PARAMETERS:显示数据库当前NLS参数取值2.5.5修改NLS参数使用下列方法可以修改NLS参数(1)修改实例启动时使用的初始化参数文件(2)修改环境变量NLS_LANG(3)使用ALTER SESSION语句,在oracle会话中修改(4)使用某些SQL函数NLS作用优先级别:Sql function > alter session >环境变量或注册表>参数文件>数据库默认参数三.EXP/IMP与字符集3.1 EXP/IMPExport和Import是一对读写Oracle数据的工具。
Export将Oracle数据库中的数据输出到操作系统文件中, Import把这些文件中的数据读到Oracle数据库中,由于使用exp/imp进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。
EXP____________ _________________ _____________|imp导入文件|<-|环境变量NLS_LANG|<-|数据库字符集|------------ ----------------- -------------IMP____________ _________________ _____________|imp导入文件|->|环境变量NLS_LANG|->|数据库字符集|------------ ----------------- -------------四个字符集是(1)源数据库字符集(2)Export过程中用户会话字符集(通过NLS_LANG设定)(3)Import过程中用户会话字符集(通过NLS_LANG设定)(4)目标数据库字符集3.2导出的转换过程在Export过程中,如果源数据库字符集与Export用户会话字符集不一致,会发生字符集转换,并在导出文件的头部几个字节中存储Export用户会话字符集的ID号。
在这个转换过程中可能发生数据的丢失。
例:如果源数据库使用ZHS16GBK,而Export用户会话字符集使用US7ASCII,由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集,这个转换过程中,中文字符在US7ASCII中不能够找到对等的字符,所以所有中文字符都会丢失而变成“?? ”形式,这样转换后生成的Dmp文件已经发生了数据丢失。
因此如果想正确导出源数据库数据,则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集3.3导入的转换过程(1)确定导出数据库字符集环境通过读取导出文件头,可以获得导出文件的字符集设置(2)确定导入session的字符集,即导入Session使用的NLS_LANG环境变量(3)IMP读取导出文件读取导出文件字符集ID,和导入进程的NLS_LANG进行比较(4)如果导出文件字符集和导入Session字符集相同,那么在这一步骤内就不需要转换,如果不同,就需要把数据转换为导入Session使用的字符集。