Oracle架构之开启/关闭模式,数据字典,单双引号,字符集

本文围绕Oracle数据库展开,介绍了启动与关闭的命令和阶段,如nomount、mount、open阶段及不同关闭方式;阐述了数据字典的定义、分类和常用类型;说明了单双引号在SQL语句中的用途;还讲解了字符集的概念,以及Oracle Server端、Client端字符集的选择、查看和修改方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 启动

1.1 启动命令

1.2 启动阶段

1.2.1 启动数据库到 nomount 阶段

1.2.2 启动数据库到 mount 阶段

1.2.3 启动数据库到 open 阶段

1.2.4 force模式启动

1.3 关闭数据库

1.3.1 normal方式

1.3.2 transactional方式

1.3.3 immediate方式

1.3.4 abort方式

2 数据字典

2.1 简介

2.1.1 定义

2.1.2 动静分类

2.1.2.1 静态数据字典

2.1.2.2 动态性能视图

2.2 数据字典各种类型

2.2.1 X$表

2.2.2 数据字典表、数据字典视图

2.2.3 V$ 开头动态视图示例

2.3 常用数据字典

2.3.1 基本字典

2.3.2 常用动态性能视图

2.3.3 静态数据字典

2.3.4 动态数据字典

2.4 动态性能视图使用示例

3 单双引号

3.1 单引号 (')

3.1.1 简介

3.1.2 分隔符单引号 

3.2 双引号 (")

3.2.1 简介

3.2.2 示例

3.2.3 创建表时使用双引号

4 字符集

4.1 简介

4.2 Oracle字符集

4.2.1 Oracle Server 端字符集

4.2.2 Oracle Client 端字符集

4.2.3 Oralce 导入/导出 字符集


1 启动

1.1 启动命令

在cmd命令窗口,直接输入"sqlplus",直接进入oracle管理界面,输入用户名和密码后,开始启动数据库,启动数据库三个步骤:启动实例、加载数据库、打开数据库

命令格式:

startup [nomount|mount|open|force][restrict][pfile=filename]
  • nomount:表示启动实例不加载数据库
  • mount:表示启动实例、加载数据库并保持数据库的关闭状态
  • open:表示启动实例、加载并打开数据库,这个是默认选项
  • force:表示终止实例并重新启动数据库
  • restrict:用于指定以受限制的会话方式启动数据库
  • pfile:用于指定启动实例时所使用的文本参数文件,filename就是文件名

附录:  在命令行中登录oracle数据库: 

    sqlplus username/password  如:普通用户登录  sqlplus scott/tiger
    sqlplus username/password as sysdba 如:sqlplus sys/admin as sysdba
    sqlplus username/password@net_service_name 如: sqlplus scott/tiger@orcl
    sqlplus username/password@//host:port/sid 

1.2 启动阶段

Oracle 数据库的启动分为三个阶段:shutdown —> nomount —> mount —> open

1.2.1 启动数据库到 nomount 阶段

数据库启动到 nomount 阶段时,将启动数据库实例, 读取参数文件,写审计文件和警报日志,不加载数据库,也不会打开任何数据文件。因此,数据库启动到 nomount 阶段需要有正确的参数文件,需要正确的审计目录(由参数 audit_file_dest 指定)和跟踪文件目录(由 BACKGROUND_DUMP_DEST 参数指定)。

数据库从关闭状态启动到 nomount 状态会执行如下操作:

  • 按如下顺序读取初始化参数文件:spfile<ORACLE_SID>.ora —> spfile.ora —> init<ORACLE_SID>.ora
  • 分配SGA、启动后台进程;
  • 启动警报日志文件(alert_<ORACLE_SID>.log)和跟踪文件。

在nomount 阶段可以进行如下操作:

  • 可以修改参数;
  • 可以查看内存和后台进程的信息;
  • 可以创建数据库;
  • 可以重建控制文件。

启动数据库到 nomount 阶段的方法如下:startup nomount
注意:用户要以sysdba的身份登录,才会有关闭和启动数据实例额权限

由于 nomount  状态下数据库没有加载,因此无法访问数据字典。nomount 状态下参数文件已经加载,可以查看参数。 

-- 无法访问数据字典
SQL> select name from v$datafile;
select name from v$datafile
                 *
ERROR at line 1:
ORA-01507: database not mounted

-- 数据库参数已经加载
SQL> show parameter name;

1.2.2 启动数据库到 mount 阶段

数据库启动到 mount 阶段时,将启动数据库实例,加载控制文件的信息到内存,加载数据库并保持数据库关闭状态。数据库启动到 mount 阶段需要有正确的控制文件。

数据库从 nomount 状态启动到 mount 状态会执行如下操作:

  • 将先前启动的实例与数据库相关联;
  • 根据参数文件中保存的控制文件的位置找到控制文件并打开;
  • 从控制文件中读取数据文件及联机日志文件的位置与名称。(此时并不检查数据文件与联机日志文件是否存在)。

数据库启动到 mount 状态可以进行如下操作:

  • 可以备份、还原、恢复;
  • 可以查看所有的动态视图;
  • 可以移动数据库文件;
  • 可以进行数据库文件的 offline;
  • 可以打开和关闭归档模式;
  • 可以打开和关闭闪回数据库的功能。

启动数据库到 nomount 阶段的方法如下:

-- 数据库处于 nomount 状态(nomount --> mount)
alter database mount;


-- 数据库启动到 mount 阶段可以访问所有的动态视图
select name from v$datafile;

1.2.3 启动数据库到 open 阶段

数据库启动到 open 阶段时,将启动数据库实例,加载联机重做日志和数据文件并打开数据库。数据库启动到 open 阶段需要有正确的数据文件和联机日志文件。数据库处于 open 状态时可以对数据库进行所有正常的操作。

数据库从 mount 状态启动到 open 状态会执行如下操作:

  • 打开数据文件;
  • 打开联机日志文件(打开数据库时如果数据文件或联机日志文件中的任何一个不存在,会出现错误);
  • Oracle 数据库验证数据文件和联机日志文件是否能够打开,并检验数据库的一致性。如果不一致,SMON 后台进程将启动实例恢复。

启动数据库到 open 阶段的方法如下:

-- 数据库处于关闭状态(shutdown --> open)
startup

-- 数据库处于 nomount 状态(nomount --> mount)
alter database mount;

-- 数据库处于 mount 状态(mount --> mount)
alter database open;

SQL> alter database open;
Database altered.

SQL> select status from v$instance;
STATUS
------------
OPEN

注意startup命令后面不带有任何参数,就表示以open模式启动数据库实例

1.2.4 force模式启动

这种模式将终止实例并重新启动数据库,这种启动模式具有一定的强制性。比如,在其他启动模式失效时,可以尝试使用这种启动模式

startup force

1.3 关闭数据库

与启动数据库实例相同,关闭数据库实例也有三个关闭步骤关闭数据库、卸载数据库、关闭实例

语法格式:

shutdown [normal|transactional|immediate|abort]
  • normal:表示以正常方式关闭数据库
  • transactional:表示在当前所有的活动事务被提交完毕之后,关闭数据库
  • immediate:表示在尽可能短的时间内立即关闭数据库
  • abort:表示以终止方式来关闭数据库

1.3.1 normal方式

数据库正常的关闭方式,以正常停库方式关闭数据库,Oracle 将执行如下操作:

  • 阻止任何用户建立新的连接;
  • 等待查询结束;
  • 等待事务结束;
  • 产生检查点(数据同步);
  • 关闭联机日志和数据文件;
  • 关闭控制文件;
  • 关闭数据库实例。

正常停库的语法如下:shutdown normal 或者 shutdown

1.3.2 transactional方式

这种方式称为事务关闭方式,它的首要任务是能够保证当前所有的活动事物都可以被提交,并在尽可能短的时间内关闭数据库。
以事务级停库方式关闭数据库,Oracle 将执行如下操作:

  • 阻止任何用户建立新的连接;
  • 查询直接终止;
  • 等待事务结束;
  • 产生检查点(数据同步);
  • 关闭联机日志和数据文件;
  • 关闭控制文件;
  • 关闭数据库实例。

事务级停库的语法如下:shutdown transactional

1.3.3 immediate方式

这种事立即关闭方式,这种方式能够在尽可能短的时间内关闭数据库
在这种关闭方式下,oracle不但会立即中断当前用户的链接,而且会强行终止用户的当前活动事物,将未完成的事物回退,以立即关闭的方式关闭数据库时,Oracle 将执行如下操作:

  • 阻止任何用户建立新的连接;
  • 查询直接终止;
  • 中断当前事务,回滚未提交事务;
  • 产生检查点(数据同步);
  • 关闭联机日志和数据文件;
  • 关闭控制文件;
  • 关闭数据库实例。

立即停库的语法如下:shutdown immediate

1.3.4 abort方式

这种方式称为终止关闭方式,终止关闭方式具有一定的强制性和破坏性。使用这种方式会强转中断任何数据库操作,这样可能会丢失一部分数据信息,影响数据库的完整性

当数据库出现故障时,如果以上三种方式都无法正常关闭数据库,则使用强制停库。以这种方法停库,Oracle 将执行如下操作:

  • 阻止用户建立新连接和开始新事物
  • 取消未提交的活动事物,而不是回退
  • 强制结束当前正在执行的SQL语句,;
  • 立即关闭数据库

以强制停库方式停止数据库之后,数据库可能存在脏数据。重启数据库实例时会自动做实例恢复。

立即停库的语法如下:

shutdown abort

startup force = shutdown abort + startup
startup force nomount = shutdown abort + startup nomount
startup force mount = shutdown abort + startup mount

2 数据字典

2.1 简介

2.1.1 定义

数据字典是 Oracle 存放关于数据库内部信息的地方,其用途是用来描述数据库内部的运行和管理情况Oracle RDBMS使用数据字典记录和管理对象信息和安全信息,用户可以通过数据字典获取数据库相关信息,从而进行数据库管理、优化和维护工作。比如,一个数据表的所有者、创建时间、所属表空间、用户访问权限等信息,这些信息都可以在数据字典中查找到。当用户操作数据库遇到困难时,就可以通过查询数据字典来提供帮助信息。

数据字典系统表保存在 system 表空间,查询所有数据字典可使用以下命令:

SQL> select * from dictionary;

2.1.2 动静分类

Oracle 数据字典有静态和动态之分。静态数据字典在用户访问数据字典时不发生改变,动态数据字典依赖数据库运行状态、反映数据库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的。

2.1.2.1 静态数据字典

静态数据字典是由表和视图组成,数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图。静态数据字典中的视图分为三类,分别由三个前缀够成: dba_*、 all_*、user_*

  • dba_*:存储数据库中所有对象的信息,一般使用 sys 账号访问
  • user_*:存储当前用户所拥有的对象的信息(该用户模式下的所有对象)
  • all_*:存储当前用户能够访问的所有对象的信息(并不需要拥有该对象,只需要具有访问该对象的权限即可)
2.1.2.2 动态性能视图

动态性能视图是以 GB$V$ 开头的视图,记录了数据库运行时的信息和统计数据

查看 scott 用户连接:scott 用户登录到1号节点
SQL> select saddr, inst_id, sid, serial#, username from gv$session where username='SCOTT';


查看数据库包含的数据文件名称
SQL> select name from v$datafile;

2.2 数据字典各种类型

2.2.1 X$表

X$表是Oracle数据库的核心部分,用于跟踪内部数据库信息,维持数据库正常运行,在数据库启动时由Oracle应用程序动态创建,不允许SYSDBA之外的用户直接访问。X$表是加密命名的且不作文档说明。Oracle通过X$建立起其他大量视图,供用户查询管理数据库之用。

2.2.2 数据字典表、数据字典视图

数据字典表(Data Dictionary Table)用以存储表、索引、约束以及其他数据库结构的信息,表名都用$结尾(如tab$、obj$、ts$等),在创建数据库的时候通过运行sql.bsq$ORACLE_HOME/RDBMS/admin目录下)脚本来创建。

数据字典表的用户都是sys,存在在system这个表空间里,Oracle对这些数据字典都分别建立了数据字典视图,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXXUSER_XXXX,dictionary视图记录了所有的数据字典视图的名称。

  • user_类视图:描述了当前用户schema下的对象;
  • all_类视图:描述了当前用户有权限访问到的所有对象的信息;
  • dba_类视图:包括了所有数据库对象的信息;

更详细划分的话,Oracle 数据字典的名称由前缀和后缀组成,使用“_”连接,其代表的含义如下:

  • dba_:包含数据库实例的所有对象信息。
  • v$_:当前实例的动态视图,包含系统管理和系统优化等所使用的视图。
  • user_:记录用户的对象信息。
  • gv_:分布式环境下所有实例的动态视图,包含系统管理和系统优化使用的视图。
  • all_:记录用户的对象信息机被授权访问的对象信息。

2.2.3 V$ 开头动态视图示例

查看以 V$ 开头的动态视图的数量
SQL> select count(*) from dictionary where table_name like 'V$%';

查看以 V$ 开头的动态视图
SQL> select TABLE_NAME from dictionary where table_name like 'V$%';

2.3 常用数据字典

2.3.1 基本字典

基本数据字典主要包括描述逻辑存储结构和物理存储结构的数据表,另外,还包括一些描述其他数据对象信息的表,比如 dba_views、 dba_triggers、 dba_users 等。

数据字典名称说 明
dba_tablespaces关于表空间的信息
dba_ts_quotas所有用户表空间限额
dba_free_space所有表空间中的自由分区
dba_segments描述数据库中所有段的存储空间
dba_extents数据库中所有分区的信息
dba_tables数据库中所有数据表的描述
dba_tab_columns所有表、视图以及簇的列
dba_views数据库中所有视图的信息
dba_synonyms关于同义词的信息查询
dba_sequences所有用户序列信息
dba_constraints所有用户表的约束信息
dba_indexs关于数据库中所有索引的描述
dba_ind_columns在所有表及簇上压缩索引的列
dba_triggers所有用户的触发器信息
dba_source所有用户存储过程信息
dba_data_files查询关于数据库文件的信息
dba_tab_grants/privs查询关于对象授权的信息
dba_objects数据库中所有的对象
dba_users关于数据库中所有用户的信息
dba_hist_snapshot查询DBA_HIST_SNAPSHOT视图可以获取数据库的历史性能数据,包括CPU利用率、内存利用率、I/O等等
SELECT begin_interval_time, end_interval_time, cpu_usage, memory_usage
FROM dba_hist_sysmetric_summary
WHERE metric_name IN ('CPU Usage Per Sec', 'Memory Usage Per Sec')
ORDER BY begin_interval_time;

2.3.2 常用动态性能视图

Oracle 系统内部提供了大量的动态性能视图,之所以说是“动态”,是因为这些视图的信息在数据库运行期间会不断地更新。动态性能视图以 v$作为名称前缀,这些视图提供了关于内存和磁盘的运行情况,用户只能进行只读访问而不能修改它们。常用的动态性能视图及其说明如下图所示

数据字典名称说 明
v$database描述关于数据库的相关信息
v$datafile数据库使用的数据文件信息
v$log从控制文件中提取有关重做日志组的信息
v$logfile有关实例重置日志组文件名及其位置的信息
v$archived_log记录归档日志文件的基本信息
v$archived_dest记录归档日志文件的路径信息
v$controlfile描述控制文件的相关信息
v$instance记录实例的基本信息
v$system_parameter显示实例当前有效的参数信息
v$sga显示实例的 SGA 区的大小
v$sgastat统计 SGA 使用情况的信息
v$parameter记录初始化参数文件中所有项的值
v$lock通过访问数据库会话,设置对象锁的所有信息
v$session有关会话的信息
v$sql记录 SQL 语句的详细信息
v$sqltext记录 SQL 语句的语句信息
v$bgprocess显示后台进程信息
v$process当前进程的信息

2.3.3 静态数据字典

数据字典名称作用
USER_TABLES
ALL_TABLES
DBA_TABLES
查看系统或某个用户有哪些表
USER_TAB_COLUMNS
ALL_TAB_COLUMNS
DBA_TAB_COLUMNS
查看列的数据类型,字段长度等
USER_OBJECT
ALL_OBJECTS
DBA_OBJECTS
查看数据库对象。包括:DATABASE LINK、FUNCTION、INDEX、PACKAGE、PACKAGE BODY、PROCEDURE、SEQUENCE、SYNONYM、TABLE、TRIGGER、VIEW
USER_SOURCE
ALL_SOURCE
DBA_SOURCE
源码:查看 procedure,function, package, package body 等有SQL语句的源码。trigger除外。
USER_CONSTRAINTS
ALL_CONSTRAINTS
DBA_CONSTRAINTS
查看约束
USER_CONS_COLUMNS
ALL_CONS_COLUMNS
DBA_CONS_COLUMNS
查看约束的列名
USER_INDEXES
ALL_INDEXES
查看索引信息
USER_IND_COLUMNS
ALL_IND_COLUMNS
DBA_IND_COLUMNS
索引列信息
USER_SYNONYMS
ALL_SYNONYMS
DBA_SYNONYMS
查看同义词信息
USER_SEQUENCES
ALL_SEQUENCES
DBA_SEQUENCES
查看序列信息
USER_VIEWS
ALL_VIEWS
DBA_VIEWS
查看视图信息
USER_TRIGGERS
ALL_TRIGGERS
DBA_TRIGGERS
查看触发器信息
USER_TRIGGER_COLS
ALL_TRIGGER_COLS
DBA_TRIGGER_COLS
查看触发器用到的列
DBA_DB_LINKS查看数据库链
USER_USERS
ALL_USERS
DBA_USERS
查看用户信息
USER_SYS_PRIVS查看当前用户所拥有的系统权限
ROLE_SYS_PRIVS查看角色所拥有的系统权限
DBA_SYS_PRIVS查看所有用户所拥有的系统权限
USER_TAB_PRIVS查看当前用户所拥有的对象权限
ROLE_TAB_PRIVS查看角色所拥有的对象权限
DBA_TAB_PRIVS查看所有用户所拥有的对象权限
DBA_ROLES查看全数据库的所有角色
USER_ROLE_PRIVS查看当前用户所拥有的角色权限
ROLE_ROLE_PRIVS查看角色所拥有的角色权限
DBA_ROLE_PRIVS查看所有用户所拥有的角色权限
SESSION_PRIVS查看当前会话相关的权限

2.3.4 动态数据字典

动态视图名称作用
V$INSTANCE数据库实例的基本信息
V$DATAFILE数据文件的基本信息
DBA_DATA_FILESdba_data_files
DBA_TEMP_FILES临时文件的基本信息
V$CONTROLFILE控制文件的基本信息
V$LOGFILE日志文件的基本信息
V$DATABASE数据库的基本信息
LOG_ARCHIVE_DEST日志文件参数信息
V$PARAMETER访问参数文件
V$BGPROCESS后台进程信息
V$ARCHIVED_LOG归档状态的一些基本信息
V$SGA关于内存结构的一些信息

2.4 动态性能视图使用示例

查看数据库状态信息
-- GV$DATABASE 视图看到的两个节点其实是同一个数据库
SQL> SELECT DBID,NAME,CREATED,LOG_MODE,CURRENT_SCN FROM V$DATABASE;
SQL> SELECT INST_ID,DBID,NAME,CREATED,LOG_MODE,CURRENT_SCN FROM GV$DATABASE;


查询实例的状态信息
--节点1
SQL> SELECT INSTANCE_NUMBER, INSTANCE_NAME, HOST_NAME FROM V$INSTANCE;
或者
SQL> SELECT INSTANCE_NUMBER, INSTANCE_NAME, HOST_NAME FROM GV$INSTANCE;


查询数据文件的基本信息
SQL> SELECT FILE#,NAME,TS#,STATUS FROM V$DATAFILE;


查询临时文件的基本信息
SQL> SELECT FILE#,NAME,TS# FROM V$TEMPFILE;
或者
SQL> SELECT INST_ID,FILE#,NAME,TS# FROM GV$TEMPFILE;

查询控制文件的基本信息
SQL> SELECT NAME,STATUS FROM V$CONTROLFILE;
或者
SQL> SELECT INST_ID,NAME,STATUS FROM GV$CONTROLFILE;


查询日志文件的基本信息
查看日志组
SQL> SELECT GROUP#,MEMBERS,ARCHIVED,STATUS FROM V$LOG;
或者
SQL> SELECT INST_ID,GROUP#,MEMBERS,ARCHIVED,STATUS FROM GV$LOG;

查询日志文件
SQL> SELECT GROUP#,STATUS,TYPE,MEMBER FROM V$LOGFILE;
或者
SQL> SELECT INST_ID,GROUP#,STATUS,TYPE,MEMBER FROM GV$LOGFILE;

查询日志归档信息
SQL> select name,dest_id,blocks,block_size,
     archived,status,backup_count
     from v$archived_log
     where rownum<10
     order by COMPLETION_TIME desc;


查询内存信息
SQL> select name, value/1024/1024 SIZE_MB from v$sga;
SQL> select pool,name,bytes from v$sgastat;
SQL> select owner,name,type,namespace,locks from v$db_object_cache where rownum<10;
SQL> select sql_id,sql_text from v$sql where rownum<5;

3 单双引号

3.1 单引号 (')

3.1.1 简介

一般用途:

  • 用于 字符串 字面量的表示。
  • 在 SQL 语句中,所有的字符串值都需要用单引号括起来
  • 如果字符串中包含单引号,可以使用双单引号 ('') 来转义。

例子:

SELECT 'Hello World' FROM dual; 

-- 包含单引号的字符串 
SELECT 'O''Reilly' FROM dual;

-- 结果: O'Reilly

3.1.2 分隔符单引号 

在Oracle Database 10g之前,如果字符串文本包含单引号,那么必须使用两个单引号表示。例如,如果要为某个变量赋值I’m a string, you’re a string,那么字符串文本必须要采用以下格式

string_var:= 'I''m a string,you''re a string';

在Oracle Database 10g之后,如果字符串文本包含单引号,那么既可以使用原有格式进行赋值,也可以使用其他分隔符([]、{}、<>等)进行赋值。

如果要使用分隔符[]、{}、<>为字符串赋值,那么不仅需要在分隔符前后加单引号,而且需要带有前缀qq'[]' 是一种支持字符串带有特殊字符的扩展语法,用于避免字符串中的单引号冲突。

示例:

string_var:= q'[I'm a string,you're a string.]';

3.2 双引号 (")

3.2.1 简介

一般用途:

  • 用于 引用标识符(表名、列名、别名等)。
  • 当要使用保留关键字、特殊字符或者大小写敏感的名称时,必须使用双引号
  • 双引号中的标识符是区分大小写的如果不使用双引号,Oracle 会自动将标识符转换为大写。

3.2.2 示例

-- 引用保留关键字作为表名
SELECT * FROM "user"; -- 表名就是小写

-- 大小写敏感的列名
SELECT "FirstName" FROM employees;

-- 双引号中的标识符区分大小写,必须严格匹配
SELECT * FROM "MyTable"; -- 区分大小写,表名必须写成"MyTable"

3.2.3 创建表时使用双引号

在 Oracle 中,表名列名 在没有使用双引号 (") 的情况下,会被自动转换为大写。

具体规则:

  • 如果在创建表或列时不使用双引号,Oracle 会将名称转换为大写存储
  • 如果使用双引号,则 Oracle 会严格按照给定的大小写存储名称,而且访问时必须使用相同的大小写。

示例 1:不使用双引号

CREATE TABLE my_table (
    id NUMBER,
    name VARCHAR2(50)
);

-- 实际上表名和列名会被 Oracle 存储为大写
-- 表名为 MY_TABLE,列名为 ID 和 NAME

-- 查询时可以这样:
SELECT * FROM my_table;  -- 不区分大小写,Oracle 将其视为 MY_TABLE

示例 2:使用双引号

CREATE TABLE "my_table" (
    "id" NUMBER,
    "name" VARCHAR2(50)
);

-- 这里表名和列名严格按照给定的大小写存储
-- 表名为 my_table,列名为 id 和 name

-- 查询时必须使用相同的大小写:
SELECT * FROM "my_table";  -- 必须严格使用小写

4 字符集

4.1 简介

字符集(Character Set) :按照一定的字符编码方案,将特定的符号集编码为计算机能够处理的数值的集合。
常见字符集名称:ASCII字符集、Unicode字符集、GB2312字符集、BIG5字符集、 GB18030字符集等。每个字符集包含的字符个数不同,在字符集转换过程中,如果源字符集中的某个字符在目标字符集中没有定义,将会出现信息丢失。

字符编码(Character Encoding):是一套规则,能够使自然语言字符的一个集合(如字母表或音节表),与其他的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,因此字符编码就是将语言符号转换为计算机可以接受的数字系统的数值
如,Unicode是字符集,UTF-8、UTF-16、UTF-32是三种字符编码方案。

点击此处了解计算机编码历史

4.2 Oracle字符集

Oracle的字符集命名遵循以下命名规则:<Language><bit size><encoding>,即: <语言> <比特位数> <编码>

比如:ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集
WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)

4.2.1 Oracle Server 端字符集

创建数据库时,需要选择字符集与国家字符集(通过create database中的CHARACTER SETNATIONAL CHARACTER SET子句指定)。如果只需存储英文,选择US7ASCII作为字符集就可以;如果要存储中文,需选择能够支持中文的字符集(如ZHS16GBK);如果存储多国语言文字,要选择UTF8。

数据库字符集的确定,实际上说明这个数据库所能处理的字符的集合及其编码方式,由于字符集选定后再进行更改会有诸多的限制,所以在数据库创建时一定要考虑清楚后再选择(默认的字符集,如WE8ISO8859P1或US7ASCII都没有汉字编码)。

可通过查询数据字典或v$视图查看Oracle Server端字符集

查询语句如下:

select userenv('language') from dual;
select * from nls_database_parameters where parameter='NLS_CHARACTERSET'
select * from v$nls_parameters where parameter='NLS_CHARACTERSET';

  • NLS_DATABASE_PARAMETERS:来源于props$,显示数据库当前NLS参数取值,包括数据库字符集取值;
  • NLS_INSTANCE_PARAMETERS:来源于v$parameter,表示服务端的字符集的设置,可能是参数文件,环境变量或者是注册表;
  • NLS_SESSION_PARAMETERS:来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session改变后的参数值(不包括由NLS_LANG 设置的客户端字符集)。如果会话没有特殊的设置,将与nls_instance_parameters一致;
  • V$NLS_PARAMETERS:显示数据库当前NLS参数取值。

如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集。当一种字符集(字符集A)的编码数值包含所有另一种字符集(字符集B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级,或称字符集B是字符集A的子集。

例如UTF8是US7ASCII的超集,修改数据库字符集可使用如下语句:

ALTER DATABASE CHARACTER SET UTF8

4.2.2 Oracle Client 端字符集

客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus、exp/imp等。

客户端字符集是通过设置 NLS_LANG参数来设定的,NLS_LANG由以下部分组成:

<Language>\_<Territory>.<Clients Characterset>

如:AMERICAN _ AMERICA. ZHS16GBK。

  • Language: 指定消息的语言, 影响提示信息是中文还是英文
  • Territory: 指定默认的日期和数字格式,
  • Clients Characterset: 指定字符集,本意就是用来指明客户端操作系统缺省使用的字符集。所以按正规的用法,NLS_LANG应该按照客户端机器的实际情况进行配置, 真正影响数据库字符集的是第三部分。两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。

NLS作用优先级别:

Sql function > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数

查询oracle client端的字符集

  • Windows:set nls_lang
  • Unix:echo $NLS_LANG

如果检查发现server端与client端字符集不一致,需要统一修改为同server端相同的字符集:

  • Windows:set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,或者修改注册表:Regedit.exe –>HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE-HOME
  • Unix:export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
    或者编辑oracle用户的profile文件

4.2.3 Oralce 导入/导出 字符集

在用exp导出数据imp导入时需要注意ORACLE字符集问题,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,分别是

  • 源数据库字符集
  • Export过程中用户会话字符集(通过NLS_LANG设定)
  • Import过程中用户会话字符集(通过NLS_LANG设定)
  • 目标数据库字符集

以上涉及三方面的字符集:oracel server端的字符集,oracle client端的字符集,dmp文件的字符集,在数据导入的时候,需要这三个字符集都一致才能正确导入。

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

select nls_charset_name(to_number('0354','xxxx')) from dual;
ZHS16GBK

如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):

cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值