Oracle使用对字符集和修改字符集的详细说明。
Oracle字符集是一组的一个字节数据的解释的符号,它的大小和相互宽容。Oracle支持国家语言的体系结构允许您存储,处理,和使用本地化语言检索数据。它使数据库工具,错误信息,排序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
影响Oracle数据库字符集的最重要的参数是nls_lang参数。
其格式如下:nls_lang = language_territory.charset
它有三个组件(语言、区域和字符集),每个组件控制NLS子集的特征。
其中:
语言:指定服务器消息的语言,用中文或英文影响提示信息。
区域:指定服务器的日期和数字格式,
字符集:指定的字符集。
如:美国美国。zhs16gbk _
从nls_lang组成,我们可以看到,数据库字符集的真正影响其实是第三个部分。
因此,两个数据库之间的字符集可以将数据导入彼此,只要第三个部分。影响数据的唯一因素是中文或英文。
两。字符集的相关知识:
2.1字符集
In essence, a set of numeric codes is given to a set of specific symbols in accordance with a certain character coding scheme.The first coding scheme supported by the Oracle database is 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代表所有,指的是所有的语言),zhs16cgb231280
(2)固定长度多字节编码
每个字符使用固定长度的字节编码方案。目前Oracle只支持固定长度的多字节编码al16utf16,并用于国家字符集。
2.2.3 Unicode编码
Unicode是一种覆盖世界上所有已知字符的单一编码方案。也就是说,Unicode提供了独特的每character.utf-16编码是16位编码的Unicode,一个固定长度的多字节编码,2个字节的Unicode字符,和UTF-16编码字符集al16utf16。
UTF-8是Unicode 8位编码方法。它是一种可变长度的多字节编码,可以用1, 2字节和3字节表示。一个Unicode字符表示的al32utf8,UTF8和utfe,这是UTF-8编码字符集。
2.3字符集超级
当字符集(字符集A)数字编码包含所有其他字符集(字符集b)编码值,以及两个字符集编码相同字符的数字表示时,字符集是字符集B超,或B字符集是字符集的子集。
Oracle8i和Oracle9i的官方文件的一个子集超控制表(集的超集对),例如,we8iso8859p1是we8mswin1252子集。因为US7ASCII是Oracle数据库格式编码的早,所以有很多字符集是US7ASCII的超集,如we8iso8859p1,zhs16cgb231280,zhs16gbk是US7ASCII的超集。
2.4数据库字符集(Oracle服务器端字符集)
数据库字符集是在创建数据库时指定的,通常在创建数据库后不能更改。在创建数据库时,可以指定字符集(字符集)和国家字符集(国家字符集)。
2.4.1字符集
(1)用来存储CHAR,VARCHAR2,CLOB,长数据和其他类型
(2)用于标记诸如表名、列名和PL / SQL变量等。
(3)用于存储SQL和SQL SQL程序单元等。
2.4.2国家字符集:
(1)存储数据,数据类型,与其他类型的用户使用
(2)国家字符集本质上是为Oracle选择的一个附加字符集。主要目的是提高Oracle数据库字符处理能力,因为nchar数据类型可以为固定长度的多字节编码支持亚洲,而数据库字符集不是。国家字符集定义在Oracle9i和只能在Unicode编码的al16utf16和UTF8选择,默认值是al16utf16
2.4.3查询字符集参数
可以查询以下数据字典或视图以查看字符集设置
nls_database_parameters,道具nls_parameters美元美元,V
在查询结果中,nls_characterset表示的字符集,而nls_nchar_characterset代表国家字符集
2.4.4修改数据库字符集
如上所述,数据库字符集在创建后原则上不能更改。但是有2种方法可以完成。
1。如果需要修改字符集,通常需要导出数据库数据、重建数据库,然后导入数据库数据来转换它。
2。通过修改数据库字符集语句修改字符集,但在创建数据库字符集的修改是有限的,只有新的字符集是修改数据库字符集的一个超集当前字符集,例如,UTF8是US7ASCII的超集,修改数据库字符集可以使用ALTER DATABASE utf8字符集。
2.5客户端字符集(nls_lang参数)
2.5.1客户端字符集的意义
客户端字符集定义了客户端的字符数据的编码,任何来自或发送到客户端使用客户端定义的字符集编码的字符数据,客户端可以被视为各种各样的应用程序,可以直接与数据库连接如SQLPlus、口/小鬼等。客户端字符集设置nls_lang参数。
2.5.2 nls_lang参数格式
nls_lang = _。
语言:显示Oracle消息、检查、日期名称
区域:指定默认日期、数字、货币和其他格式。
客户端字符集:指定客户端将使用的字符集。
例如:nls_lang = american_america.us7ascii
美国是一个语言,是美国的一个区,和US7ASCII是客户端字符集
2.5.3客户端字符集的设置方法
1)unix环境
nls_lang美元=简化chinese_china.zhs16gbk
出口nls_lang美元
编辑Oracle用户的配置文件
2)windows环境
编辑注册表
hkey_local_machine REGEDIT.EXE————软件的预言——家
2.5.4 NLS参数查询
Oracle提供了许多NLS参数,定制数据库和用户机适应当地的格式,如nls_language,nls_date_format,nls_calender,等,可以查询数据字典视图或以下。
nls_database_parameters:显示当前的数据库NLS参数值,包括数据库字符集的价值
nls_session_parameters:显示设定的nls_lang参数,或者参数值后改变会话改变(不包括客户端的字符集设置nls_lang)。
nls_instance_paramete:显示由参数文件init.ora参数的定义
V nls_parameters美元:显示当前的数据库NLS参数值
2.5.5 NLS参数修改
以下方法可用于修改NLS参数
(1)修改实例启动时使用的初始化参数文件。
(2)修改环境变量nls_lang
(3)使用oracle会话语句修改Oracle会话中的会话语句
(4)使用一些SQL函数
角色优先级:SQL函数>更改会话>环境变量或注册表>参数文件>数据库默认参数
三、进出口和字符集
3.1进出口
出口和进口都是阅读和写作的Oracle数据对工具。出口的Oracle数据库数据输出到操作系统的文件,这些文件中导入读取Oracle数据库的数据,由于该口 /进出口数据迁移的使用,从源数据库到目标数据库的数据有四个方面的字符集有关,如果这四个方面的字符集不一致的字符集将发生转换。
复制代码代码如下所示:
口
____________ _________________ _____________
|进口文件| <- |环境变量nls_lang | <- |数据库字符集|
------------------------------------------
进口
____________ _________________ _____________
|进口文件| -> |环境变量nls_lang | -> |数据库字符集|
------------------------------------------
四个字符集是
(1)源数据库字符集
(2)在出口过程中设置用户会话字符(由nls_lang)
(3)在进口过程中设置用户会话字符(由nls_lang)
(4)目标数据库的字符集
3.2出口换算程序
在导出过程中,如果源数据库字符集与导出用户会话字符集不一致,则发生字符集转换,导出用户会话字符集的ID号存储在导出文件的头几个字节中。
例如:如果使用zhs16gbk源数据库,并导出用户会话字符集使用US7ASCII,因为zhs16gbk是一个16位的字符集,而US7ASCII是7字符集的转换过程,汉字不能同行在US7ASCII人物,所以所有的汉字都会丧失,转化为形式,这样生成的DMP文件已丢失的数据。
所以如果你想正确导出源数据库中的数据,在用户会话字符集过程的出口应等于源字符集的超集的源数据库或数据库的字符集
3.3导入转换过程
(1)确定导出数据库字符集环境。
通过读取导出文件头,可以获得导出文件的字符集。
(2)确定一套进口的会议,这是性格,这nls_lang环境变量是由会话使用
(3)IMP读取导出文件
读取导出文件的字符集ID,并比较与nls_lang导入过程
(4)如果导出的文件字符集与导入的会话字符集相同,则在此步骤中不需要进行转换。如果它不同,它需要将数据转换为导入到会话中的字符集,可以看出在将数据导入数据库过程中发生两个字符集转换。
第一次:导入文件字符集和导入到会话中的字符集之间的转换,如果转换过程没有正确完成,则导入到目标数据库的导入过程将无法完成。
第二次:导入会话字符集和数据库字符集之间的转换。
四。查看数据库字符集
涉及三个方面的字符集。
字符设置在1。Oracle服务器端;
字符设置在2。oracle客户端;
3的字符集。DMP文件。
当您进行数据导入时,需要将这三个字符集保持一致才能正确导入。
4.1查询oracle服务器端的字符集
有很多方法可以找到Oracle服务器端的字符集,而更直观的查询方法如下:
复制代码代码如下所示:
SQL >选择Userenv('language)从双;
Userenv('language)
----------------------------------------------------
简化chinese_china.zhs16gbk
SQL >选择Userenv('language双;
美国美国。zhs16gbk _
4.2如何查询一个DMP文件的字符集
dmp文件由Oracle的EXP工具出口还包含字符集信息,第二和第三字节的DMP文件记录集的DMP文件的字符。如果DMP文件不是很大,例如,只有几米或几十米,你可以使用UltraEdit打开(16元模式)看第二第三字节的内容,如0354,然后使用下面的SQL来找出其对应的字符集。
复制代码代码如下所示:
SQL >选择nls_charset_name(to_number('0354 ','xxxx '))从双;
zhs16gbk
If DMP files are large, such as 2G above (which is the most common case), text editor is slow or completely incapable of opening. 您可以使用以下命令(在UNIX主机上):
猫exp.dmp | OD X |头1 | awk {打印2美元3美元}的|切C 3-6
然后利用上面的SQL语句得到相应的字符集。
4.3查询oracle客户端的字符集
在Windows平台下,它在注册表中相应的nls_lang oraclehome。你也可以设置自己的DOS窗口。
例如:设置nls_lang = american_america.zhs16gbk
这只会影响此窗口中的环境变量。
在UNIX平台下,它是环境变量nls_lang。
复制代码代码如下所示:
$ echo $ nls_lang
american_america.zhs16gbk
如果检查结果发现服务器端与客户端的字符集不一致,请将其修改为与服务器端相同的字符集。
补充:
(1)。数据库服务器字符集
SELECT * FROM nls_database_parameters
它是一个表示数据库的字符集。
(2)。客户端字符集环境
复制代码代码如下所示:
SELECT * FROM nls_instance_parameters
它来自V $参数,它代表客户机字符集的设置,它可能是参数文件、环境变量或注册表。
(3)。会话字符集环境
SELECT * FROM nls_session_parameters
从V nls_parameters美元,这意味着会议本身的设置。它可能是会话的环境变量或更改会话的完成。如果谈话是不成立的,它将符合nls_instance_parameters。
(4)。客户机的字符集需要与服务器一致才能正确显示数据库的非ASCII字符。
如果存在多个设置,则NLS操作的优先级别是sql函数>更改会话>环境变量或注册表>参数文件>数据库默认参数。
字符集是一致的,但语言设置可以不同,语言设置是推荐英语。如果字符集是zhs16gbk,然后nls_lang可以american_america.zhs16gbk。
五。修改oracle的字符集
正如上面提到的,数据库的字符集是不可以改变的原则后的创作。因此,它是考虑字符集使用在设计和安装的开始重要。数据库服务器,修改错误的字符集将导致许多不可预知的后果,可能会严重影响数据库的正常运行,所以肯定有两种字符集的子集和超集之前修改。一般来说,除非我们不得不修改Oracle数据库,不建议设置服务器端的字符。特别是,我们最常用的两种字符集不是子集和超集zhs16gbk和zhs16cgb231280的关系,所以理论不支持两个字符集之间的相互转换。
但是,有2种方法来修改字符集。
1。通常需要导出数据库数据,重建数据库,然后导入数据库中的数据以转换的方式。
2。通过修改数据库字符集语句修改字符集,但在创建数据库字符集的修改是有限的,只有新的字符集是修改数据库字符集的一个超集当前字符集,例如,UTF8是US7ASCII的超集,修改数据库字符集可以使用ALTER DATABASE utf8字符集。
5.1修改服务器端字符集(不推荐)
1。关闭数据库
立即关闭
2。开始Mount
复制代码代码如下所示:
启动挂载;
启用受限会话;
SQL >修改系统设置job_queue_processes = 0;
SQL >修改系统设置aq_tm_processes = 0;
打开数据库;
这里可以从父集设置为子集。
复制代码代码如下所示:
SQL >修改数据库字符集zhs16gbk;
SQL数据库字符集al16utf16 >;
如果是一个子集的父集,你需要使用internal_use参数,跳过超子集检测
SQL >修改数据库字符集internal_use al32utf8;
SQL数据库>改变国家字符集internal_use al16utf16;
立即关闭;
已启动
注意:如果没有大对象,在使用过程中不会对语言转换产生影响。(记住字符集必须是Oracle支持,否则不能启动)。
如果有一个ora-12717:不能修改数据库字符集时,NCLOB数据存在这样的提示,
解决这个问题有两种方法。
1。利用internal_use关键词修改现场,
2。使用重新创建,但重新创建复杂一点,所以用internal_use
复制代码代码如下所示:
立即关闭;
启动安装;
启用受限会话;
SQL >修改系统设置job_queue_processes = 0;
SQL >修改系统设置aq_tm_processes = 0;
打开数据库;
警告:改变internal_use UTF8字符集;
立即关闭;
启动>;
如果你做到以上,有与国家字符集的设置没有问题
5.2修改dmp文件的字符集
如上所述的DMP文件的第二第三字节的字符集信息的记录。因此,直接修改的DMP文件的第二第三字节的内容可以欺骗Oracle检查。这一理论是唯一集的超集可以修改,但在许多情况下,不是在子集和超集关系的情况下也可以修改我们的一些常见的字符集,如US7ASCII,we8iso8859p1,zhs16cgb231280,zhs16gbk基本上是可以改变的,因为变化是唯一的DMP文件,所以影响不是很。
有修改的更具体的方法,和最简单的方法是修改的DMP文件的第二和第三字节直接用UltraEdit。
For example, if you want to change the character set of DMP file to ZHS16GBK, you can use the following SQL to find out the 16 binary code corresponding to this character set: SQL> select to_char (nls_charset_id ('ZHS16GBK'),'xxxx') from dual;
0354
然后改变2和3字节的DMP文件0354。
如果dmp文件大,不能打开UE,你需要使用的程序的方法。
5.3客户端字符集设置方法
1)unix环境
复制代码代码如下所示:
nls_lang = simplifiedchinese_china.zhs16gbk美元
exportnls_lang美元
编辑Oracle用户的配置文件
2)windows环境
编辑注册表
复制代码代码如下所示:
regedit.exe-- -hkey_local_machine ---软件---甲骨文--家
或者放在窗户里:
复制代码代码如下所示:
setnls_lang = american_america.zhs16gbk