Oracle 字符集知识

来源:互联网 发布:液晶字幕编辑软件 编辑:程序博客网 时间:2024/05/21 15:02
 
Oracle 字符集知识
一、定义:
    Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
   当字符串不能被正确解释时就会形成乱码,即所选的字符集与该字符串不匹配,只有选择正确字符集才能正确显示。
与Oracle数据库相关的字符保存/显示一般和3个字符集有关:
1、是oracel server端(服务器)的字符集;
2、是oracle client端(客户端)的字符集;
3、是客户端操作系统的字符集。
需要这三个字符集都一致或者由相互包容的关系才能正确保存入库或显示。
 
二、如何查看这几个字符集:
1、查看oracel server端(服务器)的字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
2、查看oracel client端的字符集
根据ORACLE 客户端所选sql*net 的版本分为下列两种情况:  
a. 客户端为 sql*net 2.0 以下的版本,在oracle.ini文件中进行查看。  
b. 客户端为 sql*net 2.0 以上版本   
查看注册表HKEY_LOCAL_MACHINE——〉SOFTWARE——〉ORACLE里NLS_LANG。   
附:NLS_LANG格式如下:
NLS_LANG = language_territory.charset
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:
Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK
从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
3、查看操作系统的字符集
我们使用chcp命令来获得windows使用的字符集
c:chcp
活动的代码页: 936
通过oracle的官方文档阅读,我们可以将它等同于ZHS16GBK字符集(在安装oracle时,oracle会找到安装平台的字符集,并默认将对应的字符集设置成与它相同)。
所以现在我们可以认为,我们使用的操作系统是ZHS16GBk字符集,那么我们在这个环境下输入的字符(也可以说是显示的字符,用的就是这个字符集的编码)。
 
三、如何修改这三种字符集
1、修改oracel server端(服务器)的字符集
1) 服务器端重新安装ORACLE   
     在重新安装ORACLE 时选择与原卸出数据一致的字符集。 这种情况仅仅使用于空库和具有同一种字符集的数据。   
2)强行修改服务器端ORACLE当前字符集   
    在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:   
        SQL> create database character set US7ASCII;
        create database character set US7ASCII
        ERROR 位于第 1 行:
        ORA-01031: 权限不足
    你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载数据。等数据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE 数据库,在sql>命令提示符下,运行
        select * from V$NLS_PARAMETERS
可以看到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正确显示。   
2、修改oracel client端的字符集,配置方法有两种:   
1)在安装ORACLE的客户端软件时指定字符集
    在安装ORACLE的客户端产品软件时,选择与ORACLE服务端一致的字符集即可。
2)修改注册信息的方法   
根据ORACLE 客户端所选sql*net 的版本分为下列两种情况:  
a. 客户端为 sql*net 2.0 以下的版本,在oracle.ini文件中修改。  
进入Windows的系统目录,编辑oracle.ini文件,替换原字符集,重新启动计算机,设置生效。   
b. 客户端为 sql*net 2.0 以上版本   
修改注册表HKEY_LOCAL_MACHINE——〉SOFTWARE——〉ORACLE里NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集。   

四、oracle字符保存显示过程
对信息进行入库保存信息时:
    a. 输入时,都三个字符集都一样,最终以服务器端的字符集存入数据库。
    b. 输入时,如果Oracle客户端字符集跟Oracle端字符集设置不一样,那么输入的字符就会做字符转换,最终以务器端的字符集存入数据库服务器
  c. 输入时,如果Oracle客户端字符集跟Oracle服务器端字符集设置一样,那么不会有任何字符转换,最终以客户端操作系统字符集(不是Oracle客户端字符集)存入数据库
客户端操作系统字符集
oracle client
oracel server
入库的字符保存方式
A
A
A
A
 
B
A
A
B
A
A
B
注:以dmp文件导入数据库时, oracel server、oracle client、dmp文件字符集都一致才能正确导入。
 
库内字符输出显示时:
    a. 输入时,都三个字符集都一样,那么输出显示正确。
  b. 输出时,如果Oracle客户端字符集跟Oracle服务器端字符集设置不一样,那么输出的字符会做字符转换,如果客户端操作系统字符集能够正确解释,那么输出显示正确,否则乱码
c. 输出时,如果Oracle客户端字符集跟Oracle服务器端字符集设置一样,那么不会有任何字符转换,如果客户端操作系统字符集能够正确解释,那么输出显示正确,否则乱码
 
oracel server
oracle client
客户端操作系统字符集
库内字符输出显示方式
A
A
A
正确
A
B
A
乱码
A
B
B
正确
A
A
A
正确
A
A
B
乱码
 
 
原创粉丝点击