数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

oracle字符集文档


发布日期:2022年07月03日
 
oracle字符集文档

Oracle字符集是一个字节数据的解释的符号集合有大小之分有相互的包容关系ORACLE支持国家语言的体系结构允许你使用本地化语言来存储处理检索数据它使数据库工具错误消息排序次序日期时间货币数字和日历自动适应本地化语言和平台

Oracle字符集相关知识

参数说明

影响oracle数据库字符集最重要的参数是NLS_LANG参数

Oracle的字符集命名遵循以下命名规则:

<Language><bit size><encoding>

即: <语言><比特位数><编码>

比如: ZHSGBK表示采用GBK编码格式位(两个字节)简体中文字符集

它的格式如下NLS_LANG = language_territorycharset

它有三个组成部分(语言地域和字符集)每个成分控制了NLS子集的特性

其中Language 指定服务器消息的语言territory 指定服务器的日期和数字格式charset 指定字符集如:AMERICAN _ AMERICA ZHSGBK

从NLS_LANG的组成我们可以看出真正影响数据库字符集的其实是第三部分

所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据前面影响的只是提示信息是中文还是英文

查看数据库字符集

这涉及三方面的字符集

一是oracel server端的字符集;

二是oracle client端的字符集;

三是dmp文件的字符集;

在做数据导入的时候需要这三个字符集都一致才能正确导入

查询oracle server端的字符集

有很多种方法可以查出oracle server端的字符集

①比较直观的查询方法

SQL> select userenv(language) from dual;

查询结果如下: SIMPLIFIED CHINESE_CHINAZHSGB

②查看有关字符集的所有参数

SELECT * FROM v$nls_parameters;

结果中的NLS_CHARACTERSET ZHSGB

查看dmp文件的字符集

用oracle的exp工具导出的dmp文件也包含了字符集信息dmp文件的第和第个字节记录了dmp文件的字符集如果dmp文件不大比如只有几M或几十M可以用UltraEdit打开(进制方式)看第个字节的内容然后用以下SQL查出它对应的字符集:

SQL> select nls_charset_name(to_number(xxxx)) from dual;ZHSGBK

查询oracle client端的字符集

在windows平台下就是注册表里面相应OracleHome的NLS_LANG具体路径

Win+R àregedit à HKEY_LOCAL_MACHINESOFTWAREORACLE nls_lang 显示本地的字符集这样就只影响这个窗口里面的环境变量

在unix平台下就是环境变量NLS_LANG

$echo $NLS_LANG

AMERICAN_AMERICAZHSGBK

如果检查的结果发现server端与client端字符集不一致建议统一修改为同server端相同的字符集

建议

关于字符集客户端的字符集要求与服务器一致才能正确显示数据库的非Ascii字符如果多个设置存在的时候alter session>环境变量>注册表>参数文件

客户端的字符集要求与服务器一致才能正确显示数据库的非Ascii字符如果多个设置存在的时候alter session>环境变量>注册表>参数文件

字符集要求一致但是语言设置却可以不同语言设置建议用英文如字符集是zhsgbk则nls_lang可以是 American_Americazhsgbk

补充内容

数据库服务器字符集

SELECT * FROM nls_database_parameters;

客户端字符集环境

SELECT * FROM nls_instance_parameters;

会话字符集环境

SELECT * FROM nls_session_parameters;

关于oracle字符集修改

一旦数据库创建后数据库的字符集理论上讲是不能改变的因此在设计和安装之初考虑使用哪一种字符集十分重要根据Oracle的官方说明字符集的转换是从子集到超集受支持反之不行如果两种字符集之间根本没有子集和超集的关系那么字符集的转换是不受oracle支持的对数据库 server而言错误的修改字符集将会导致很多不可测的后果可能会严重影响数据库的正常运行所以在修改之前一定要确认两种字符集是否存在子集和超集的关系一般来说除非万不得已我们不建议修改oracle数据库server端的字符集特别说明我们最常用的两种字符集ZHSGBK和 ZHSCGB之间不存在子集和超集关系因此理论上讲这两种字符集之间的相互转换不受支持

下例为把数据库的字符集从ZHSGBK修改为 ZHSGB

执行脚本

对于每个sql脚本的含义请见注释①~⑥

startup mount ;

alter session set sql_trace=true;

alter system enable restricted session;

alter system set job_queue_processes=;

alter system set aq_tm_processes=;

alter database open;

set linesize ;

alter database character set INTERNAL_USE ZHSGB;

shutdown immediate ;

startup ;

相关参数注释

查看字符集参数SELECT * FROM v$nls_parameters;

①SQL_TRACE是Oracle提供的用于进行SQL跟蹤的手段是强有力的辅助诊断工具在日常的数据库问题诊断和解决中SQL_TRACE是非常常用的方法

sql_trace =true

在全局启用SQL_TRACE会导致所有进程的活动被跟蹤包括后台进程及所有用户进程这通常会导致比较严重的性能问题所以在生产环境中要谨慎使用这个参数在g之后是动态参数可以随时调整在某些诊断中非常有效

提示: 通过在全局启用sql_trace我们可以跟蹤到所有后台进程的活动很多在文档中的抽象说明通过跟蹤文件的实时变化我们可以清晰的看到各个进程之间的紧密协调

②在使用过程中对数据库进行限制

ALTER SYSTEM DISABLE RESTRICTED SESSION来取消数据库的受限制状态在数据库受限制的过程中只有对数据库拥有CREATE SESSION权限的用户才能够连接到数据库这种状态有利于对数据库进行备份恢复导入导出等操作

③首先设置JOB_QUEUE_PROCESSES=Oracle会杀掉CJQ及相应job进程

④aq_tm_processes值可选在之间代表是关闭队列监视

⑤利用INTERNAL_USE 关键字修改区域设置目的是让Oracle数据库绕过了子集与超集的校验

⑥STARTUP NOMOUNT

然后可以使用ALTER DATABASE MOUNT 来挂上数据库可以使用 STARTUP MOUNT来启动数据库并挂载上数据库但是保持数据库的关闭状态稍后可以使用ALTER DATABASE OPEN来打开数据库

上一篇:配置好oms不能搜索到数据库节点的解决办法

下一篇:Oracle] Data Guard 之 浅析Switchover与Failover