目录
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_XXXX和USER_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_FILES | dba_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之后,如果字符串文本包含单引号,那么既可以使用原有格式进行赋值,也可以使用其他分隔符([]、{}、<>等)进行赋值。
如果要使用分隔符[]、{}、<>为字符串赋值,那么不仅需要在分隔符前后加单引号,而且需要带有前缀q。q'[]'
是一种支持字符串带有特殊字符的扩展语法,用于避免字符串中的单引号冲突。
示例:
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 SET
与NATIONAL 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