一、 Oracle体系结构的组件
Oracle体系结构包括很多基本组件下面我们详细介绍一下这些组件。
1、Oracle 服务器:Oracle 服务器中包含多种文件结构、进程结构和内存结构;但是,处理 SQL 语句时,并非所有这些结构都会用到。某些结构用于提高数据库的性能,确保该数据库在遇到软件或硬件错误时可以恢复,或者执行维护该数据库所需的其它任务。Oracle 服务器包括一个 Oracle 实例和一个 Oracle 数据库。
2、Oracle 实例:Oracle 实例是后台进程和内存结构的组合。只有启动实例后,才能访问数据库中的数据。每次启动实例时,会分配系统全局区 (SGA) 并启动 Oracle 后台进程。后台进程代表调用进程执行各种功能。它们把为每个用户运行的多个 Oracle 程序所处理的功能统一起来。后台进程执行输入/输出 (I/O),并监视其它 Oracle 进程来提高并行性,从而使性能和可靠性更加优越。
3、Oracle 数据库:Oracle 数据库包含操作系统文件(也称为数据库文件),这些文件为数据库信息提供了实际的物理存储。数据库文件用于确保数据一致性并能在实例失败时得以恢复。
4、其它关键文件:非数据库文件用于配置实例、验证特权用户以及在磁盘出现故障时
恢复数据库。
5、用户进程和服务器进程:执行 SQL 语句时,用户进程和服务器进程是其中涉及的主要进程;但是,其它进程也会有助于服务器完成 SQL 语句的处理。
6、其它进程:还有很多供其它选件使用的其它进程,例如,高级排队 (AdvancedQueuing)、实时应用集群
(Real Application Clusters)、共享服务器 (Shared Server)
和
高级复制 (Advanced Replication)
等。这些进程将在相应的课程中分别进行讨论。
二、客户端层由两个组件组成:用户和用户进程。
三、服务器层由三个组件组成:执行SQL的服务器进程、实例、数据库本身。
1、实例组件指的是在启动时初始化的一组操作系统进程和内存结构。
2、数据库组件指的是用于数据存储和数据库操作的物理文件。
四、总结一下可知,单实例数据库的体系结构由4个交互组件构成(如下图所示):
1、用户与用户进程交互
2、用户进程与服务器进程交互
3、服务器进程与实例交互
@@error
select * from sys.messages where language_id=2052 and message_id=@@ERROR
language_id=2052 对应 sys.syslanguages 的msglangid
参考:http://hi.baidu.com/ayongs/item/30f784122c8d51a5ffded509
http://www.2cto.com/database/201108/101151.html
http://www.laruence.com/2008/01/05/12.html
mysql5.1参考手册
一.mysql字符集
MySQL 4.1及以上版本的字符集支持(Character Set Support)有两个方面:字符集(Character Set)和校对规则(Collation)。 字符集和校对规则有4个级别的默认设置:服务器(server),数据库(database),数据表(table)和连接(connection)。
MySQL 中是根据下面几个变量确定服务器端和客户端用的什么字符集:
character_set_client 客户端字符集
character_set_connection 客户端与服务器端连接采用的字符集
character_set_results SELECT查询返回数据的字符集
character_set_database 数据库采用的字符集
在服务器级别,确定方法很简单。当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。如:mysqld --default-character-set=utf8,如果启动mysql时没有指定 --default-character-set选项,那么默认的服务器级字符集为编译mysql时指定的字符集,由configure时的:--with-charset和--with-collation选项确实,默认的字符集为latin1.
每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。CREATE DATABASE和ALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则:
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]如 create database ulogd default character set utf8;
如果创建数据库时没用指定字符集,那么该数据库默认的字符集为当前服务器所使用的字符集。
每一个表有一个表字符集和一个校对规则,它不能为空。为指定表字符集和校对规则,CREATE TABLE 和ALTER TABLE语句有一个可选的子句:
CREATE TABLE tbl_name (column_list)
[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]如果创建表时没有指定表的字符集,那么该表字符集为当前数据库所使用的字符集。
每一个“字符”列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列 校对规则,它不能为空。列定义语法有一个可选子句来指定列字符集和校对规则:
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name [COLLATE collation_name]]如果没有指定列的字符集,那么该列的字符集为当前表的字符集
示例1:表和列定义
CREATE TABLE t1
(
c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci
) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin;
在这里我们有一个列使用latin1字符集和latin1_german1_ci校对规则。是显式的定义,因此简单明了。需要注意的是,在一个latin2表中存储一个latin1列不会存在问题。
示例2:表和列定义
CREATE TABLE t1
(
c1 CHAR(10) CHARACTER SET latin1
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
这次我们有一个列使用latin1字符集和一个默认校对规则。尽管它显得自然,默认校对规则却不是表级。相反,因为latin1的默认校对规则总是latin1_swedish_ci,列c1有一个校对规则latin1_swedish_ci(而不是latin1_danish_ci)。
示例3:表和列定义
CREATE TABLE t1
(
c1 CHAR(10)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
我们有一个列使用一个默认字符集和一个默认校对规则。在这种情况下,MySQL查找表级别来确定列字符集和 校对规则。因此,列c1的字符集是latin1,它的 校对规则是latin1_danish_ci。
示例4:数据库、表和列定义
CREATE DATABASE d1
DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci;
USE d1;
CREATE TABLE t1
(
c1 CHAR(10)
);
我们创建了一个没有指定字符集和校对规则的列。我们也没有指定表级字符集和校对规则。在这种情况下,MySQL查找数据库级的相关设置。(数据库的设置变为表的设置,其后变为列的设置。)因此,列c1的字符集为是latin2,它的 校对规则是latin2_czech_ci。
连接字符集和校对
考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和 校对规则的问题,这些问题均能够通过系统变量来解决:
· 当查询离开客户端后,在查询中使用哪种字符集?
服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。
· 服务器接收到查询后应该转换为哪种字符集?
转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。
· 服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?
character_set_results变量指示服务器返回查询结果到客户端使用的字