一. Oracle字符集
1.1 什么是字符集
字符集(Character Set)是一个系统支持的所有抽象字符的集合。这些字符包括字母、数字、标点符号、符号、控制字符等,它们可以通过特定的编码方式在计算机中进行表示和处理。字符集为计算机提供了表示和存储文本信息的基础。
不同的字符集可能包含不同的字符,并且每个字符在字符集中都有一个唯一的编号或代码点。这些代码点随后可以通过特定的编码方式(如UTF-8、UTF-16等)转换为计算机可以理解和处理的字节序列。
1.2 常用字符集
(1) ASCII字符集
ASCII,全称American Standard Code for Information Interchange,即美国信息交换标准代码。它是最基础的字符编码标准,使用7位二进制数(0~127)来表示128个字符,包括控制字符(如换行、回车、制表符等)和可打印字符(如数字、字母、标点符号等)。
(2) Unicode字符集
Unicode是一种字符编码标准,用于将字符集中的每一个字符分配一个唯一的数字,以便在计算机系统中进行存储、处理和交换。这个标准几乎涵盖了世界上所有语言所需的字母、数字、标点符号和符号,并被广泛应用于各种操作系统、编程语言和技术标准中。
Unicode字符具有多种编码方式,常见的有UTF-8、UTF-16、UTF-32等。
①UTF-8 (Unicode Transformation Format - 8 bits)是一种可变长度的编码方式,它使用1到4个字节来表示一个Unicode字符。它可以表示Unicode字符集中的所有字符,包括ASCII字符集,对于英语文本,UTF-8编码与ASCII编码是相同的。
②UTF-16 (Unicode Transformation Format - 16 bits)使用16位或32位的编码单元来表示一个Unicode字符,大多数Unicode字符在UTF-16中用一个16位的编码单元表示,但那些超出基本多文种平面(BMP)的字符则需要两个16位的编码单元(称为代理对)。
③UTF-32 (Unicode Transformation Format - 32 bits)使用固定长度的32位编码单元来表示一个Unicode字符。这种编码方式非常直观,因为每个Unicode代码点直接对应一个32位的编码单元。但由于它是定长的,因此可能会比可变长度的编码方式(如UTF-8)占用更多的存储空间。
(3) ANSI编码集
ANSI编码集是由美国国家标准协会(American National Standards Institute,简称ANSI)制定的一种字符编码标准。其采用多字节系统(MBCS)的变长编码方式,每个字符可以是单个字节、双字节,也可以是多字节的,从而兼容单字节字符集(SBCS)和双字节字符集(DBCS)。这种设计使得ANSI编码集能够支持多种语言字符的编码,适应不同的国家和地区,但是不同国家地区的ANSI编码是不通用的,简体中文通常使用GB2312、GBK或GB18030等编码方式,而繁体中文则使用Big5等编码方式。
(4) GB2312、GBK与GB18030编码
①GB2312
GB2312是中国国家标准的简体中文字符集编码。它是由中国国家标准总局于1980年发布,并在1981年5月1日开始实施。这个编码标准的全称是《信息交换用汉字编码字符集·基本集》,也被称为GB0。它包含了6763个汉字和682个其他符号,采用双字节表示每一个字符。GB2312编码兼容ASCII码,因此在国际标准化方面具有较好的接轨性。然而,由于GB2312的编码范围有限,它不能涵盖所有的汉字和符号,特别是在人名、古汉语等方面出现的罕用字(一些字体只支持GB2312,这就是你名字中的生僻字变成默认字体的原因)。
②GBK
GBK字符集是一种汉字内码扩展规范,也被称为国标字符集。它包含了2万多个汉字等字符,并且在GBK中,一个中文字符编码成两个字节的形式进行存储。此外,GBK还兼容了ASCII字符集。
③GB18030
GB18030是对GB2312和GBK的进一步扩展。它包含了GB2312和GBK中的所有字符,并增加了更多的字符和符号,对GB 2312-1980完全向后兼容,与GBK基本向后兼容。GB 18030共收录汉字70244个,每个字可以由1个、2个或4个字节组成,编码空间庞大,最多可定义161万个字符,这使得GB18030能够处理更广泛的字符集,包括各种文字、符号、表情符号等。
GB18030标准不仅支持汉字,还支持中国国内少数民族的文字,如藏、蒙古、傣、彝、朝鲜、维吾尔文,无需动用造字区;GB18030还包含繁体中文,日韩文字等。
(5) BIG5字符集
BIG5字符集是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。虽然不是一个法定的编码方案,但它广泛地被应用于电脑业,尤其是国际互联网中,从而成为一种事实上的行业标准。BIG5字符集收录了13060个繁体汉字和440个符号,但不包括简体汉字和一些生僻的汉字。此外,它也没有收录GBK中的日文假名字符和俄文字符。
1.3 Oracle字符集
在Oracle中,字符集的命名通常遵循以下格式:
<语言><比特位数><编码>
//ZHS16GBK
这种命名方式可以清晰地表达出字符集的主要特性。
例如,ZHS16GBK是一种常见的Oracle字符集命名。其中,“ZHS”代表“简体中文”(Zhongwen Jianti),“16”表示每个字符使用16位(即2个字节)进行编码,“GBK”则是一种常用的中文字符编码方式。因此,ZHS16GBK字符集就是用于支持简体中文的、使用GBK编码方式的、每个字符占用2个字节的字符集。
Oracle字符集还包括其他一些常见的命名,如US7ASCII、WE8ISO8859P1、AL32UTF8等。这些命名同样遵循了上述的规则,可以方便地识别出它们所支持的语言、编码方式以及字符位数。
1.4 客户端字符集
环境变量NLS_LANG
环境变量NLS_LANG是一个重要的Oracle设置,它用于定义语言、地域以及字符集属性。
NLS格式:
<语言>_<地区>.<字符集>
语言:指定服务器消息的语言,影响提示信息是中文还是英文。
地区:指定服务器的日期和数字格式。
字符集:指定字符集,这是字符编码的标准,决定了数据库如何存储、检索和比较字符数据。
在Oracle数据库中,NLS_LANG的设置使数据库工具、错误消息、排序次序、日期、时间、货币、数字,以及日历自动适应本地化语言和平台。这意味着,根据NLS_LANG的设置,用户界面的显示和语言习惯、日期格式等都可以进行本地化调整,以更好地适应不同地域和文化背景的用户需求。此外,只要NLS_LANG的字符集部分(charset)一致,不同的数据库之间就可以相互导入导出数据。而语言和地域的设置主要影响提示信息的显示语言,以及日期和数字的格式。
配置方法:设置里搜索查看高级系统设置->高级->环境变量。
电脑中NLS_LANG配置如图所示,其中SIMPLIFIED CHINESE_CHINA.ZHS16GBK表示<简体中文>_<中国地区>.<16位GBK简体中文>。
变量优先级
SQL表定义 > 会话定义 > 环境变量或注册表 > 参数文件 > 数据库默认参数
1.5 服务器端字符集
(1)创建数据库字符集
创建数据库时,需要选择字符集与国家字符集。国家字符集是指某个国家或地区所使用的特定字符编码系统,用于处理该国家或地区语言中的字符。
CREATE DATABASE TEST_DATABASE
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16;
//创建新数据库TEST_DATABASE
//设置字符集为ZHS16GBK
//设置国家字符集为AL16UTF16
(2)修改数据库字符集
字符集一旦设置好一般不会轻易修改,直接修改Oracle数据库的字符集是一个高风险的操作,可能导致数据丢失或损坏。如果需要修改字符集,通常需要创建新数据库然后导入数据数据的方式来转换。
ALTER DATABASE CHARACTER SET UTF8;
//修改数据库字符集为UTF8
(3)查询已有数据库字符集设置
数据库字符集
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
//NLS_CHARACTERSET显示的是默认字符集
//NLS_NCHAR_CHARACTERSET显示的是用国家字符集
实例字符集
SELECT * FROM NLS_INSTANCE_PARAMETERS;
//查询实例字符串设置
//若查询报错,可以试试SELECT * FROM V$PARAMETER WHERE NAME LIKE 'NLS_%';
会话字符集
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER = 'NLS_CHARACTERSET';
//查询会话字符集设置
1.6 输出字符集
在导出与导入数据库dmp文件时,需确保服务器端、客户端和文件的字符集一致,不然会出现乱码问题。
二. Oracle数据类型
2.1 字符类型
数据类型 | 长度 | 说明 |
CHAR(n) | 固定n个字符,n最大2000,n可省略,每个字符占1字节 | 数据长度不足用空格填充以达到其最大长度 |
NCHAR(n) | 同CHAR,但是每个字符占2字节 | 用于存储Unicode格式数据 |
VARCHAR2(n) | 最多n个字符,n最大4000,n不可省略,每个字符占1字节 | 变长字符串,不会用空格填充至最大长度,可以储存NULL值 |
NVARCHAR2(n) | 同CHAR,但是每个字符占2字节 | 用于存储Unicode格式数据 |
ORACLE中不支持VARCHAR类型,尽量避免使用。
2.2 数字类型
数据类型 | 长度 | 说明 |
NUMBER(m,n) | 1-22字节 | m表示几位总数,n表示几位小数 |
INTEGER | 38位 | 等同于NUMBER(38,0),相当于一个38位整数 |
RAW | 作为列:2000位 作为变量:32767字节 | 用于存储固定长度的二进制数据,不会被字符集转换影响。 |
BINARY_FLOAT | 1字节长度+4字节数据 | 32位单精度浮点数 |
BINARY_DOUBLE | 1字节长度+8字节数据 | 64位双精度浮点数 |
DECIMAL和NUMERIC类型:在Oracle中,它们实际上是NUMBER类型的同义词。
FLOAT和REAL类型:在Oracle中,它们实际上是NUMBER类型的同义词。
SMALLINT, TINYINT, MEDIUMINT, BIGINT等类型:Oracle中并不直接支持,存储这些类型的数字,可以使用NUMBER或相应的二进制浮点数类型。
(万能的NUMBER)
2.3 大数据类型
数据类型 | 长度 | 说明 |
BLOB | 最大4GB | 大文本类型,用于存储二进制字符串数据 |
BFILE | 最大4GB(外部文件) | 同BLOB,但是数据存在于数据库外部的文件,表中只存储文件地址 |
CLOB | 最大4GB | 大文本类型,用于存储单字节或多字节的字符串数据 |
NCLOB | 最大4GB | 大文本类型,用于存储Unicode格式的字符串数据 |
LONG* | 最大2GB | 同CLUB,但是局限性太大,不常用,已被替代 |
LONG RAW* | 最大2GB | RAW类型的LONG,已被BLOB替代 |
2.4 日期类型
数据类型 | 长度 | 说明 |
DATE | 固定7字节 第1字节:世纪+100 第2字节:年 第3字节:月 第4字节:天 第5字节:小时+1 第6字节:分+1 第7字节:秒+1 | 用于存储日期和时间信息,精确到秒级。 格式通常为'YYYY-MM-DD HH24:MI:SS'。 |
TIMESTAMP | 7或11字节 第1字节:世纪+100 第2字节:年 第3字节:月 第4字节:天 第5字节:小时+1 第6字节:分+1 第7字节:秒+1 第8-11字节:纳秒,整形存储 | 提供比DATE更精细的时间戳信息,可以存储到纳秒级。 格式通常为'YYYY-MM-DD HH24:MI:SS.FF'。 其中FF表示毫秒或更高精度的时间部分。 |
TIMESTAMP WITH TIME ZONE | 13字节 | 在TIMESTAMP的基础上增加了时区信息,可以存储时区偏移量,以便在不同的时区中正确地显示日期和时间。 |
INTERVAL YEAR TO MONTH | 5字节 | 用于存储时间间隔,表示年和月之间的差异。 |
INTERVAL DAY TO SECOND | 11字节 | 用于存储时间间隔,表示天、小时、分钟、秒之间的差异,并且可以包括小数秒。 |
2.5 其他类型
数据类型 | 长度 | 描述 |
ROWID | 旧版6字节新版10字节 | 伪列,它代表每一行数据的存储地址。每个数据表都有一个这样的伪列,用于存放被称为ROWID的二进制值。 |
UROWID | 可以存储外来ROWID等数据 |
三. Oracle体系结构
3.1 内存结构
Oracle的内存结构是数据库性能管理的核心部分,它基于与内存相关的初始化参数设置来管理内存。Oracle数据库的内存结构主要包括以下几个部分:
(1)系统全局区:
系统全局区(SGA, System Global Area)是一组共享内存区域,其中的数据可以被Oracle所在的操作系统上的所有会话用户和程序共享。
①共享池(Shared Pool)
库高速缓存(Library Cache):存储SQL语句的文本和执行计划。当Oracle接收到一个SQL语句时,它首先会在库高速缓存中查找是否有相同的SQL语句。如果有,Oracle将直接重用该执行计划,从而避免了重新解析和优化的开销。
数据字典高速缓存(Data Dictionary Cache):存储数据库对象的定义信息,如表、视图、索引等的元数据。
②数据库缓冲区高速缓存(Database Buffer Cache)
缓存从磁盘读取的数据块,以减少物理I/O操作。当需要访问某个数据块时,Oracle会首先在缓冲区高速缓存中查找。如果找到,则直接从内存中读取,否则会从磁盘中读取并放入缓存。
③重做日志缓冲区(Redo Log Buffer)
用于暂存对数据库所做的更改(重做条目),以便稍后写入在线重做日志文件。这确保了即使在发生故障时,也可以恢复数据库到一致的状态。
④大型池(Large Pool)
用于支持特定的操作,如备份、恢复和并行查询。它提供了一块额外的内存区域,以满足这些操作对内存的需求。
⑤Java池(Java Pool)
用于存储Java虚拟机(JVM)的代码和数据结构。
(2)程序全局区:
程序全局区(PGA, Program Global Area)是非共享的内存区域,其中包含了一个Oracle进程独占使用的数据和控制信息。每个Oracle进程启动时,都会为其创建一个PGA。对于每个服务器进程和后台进程,都会存在一个对应的PGA。
①会话区(Session Area)
存储与特定用户会话相关的信息,如变量、游标和会话状态等。
②排序区(Sort Area)
用于排序操作,如ORDER BY子句或DISTINCT操作。当需要对大量数据进行排序时,Oracle会使用排序区来存储中间结果。
③哈希区(Hash Area)
用于哈希连接操作,以提高连接操作的性能。
PGA区域还包含堆栈空间和用户全局区(UGA, User Global Area),UGA是与一个用户会话相关的内存。
(3)软件程序代码区:
这是一块用于存放那些正在运行和可以被运行的Oracle本身程序的内存区域,是独立且受保护的。通常,软件程序代码区的大小是固定的,只有在Oracle进行了版本升级或重新安装后才会改变。
此外,Oracle的内存管理还包括自动内存管理(Automatic Memory Management)功能,它指定实例内存的目标大小,并自动管理SGA内存和实例PGA内存。根据需要在SGA和PGA实例之间重新分配内存,以实现内存的最优利用。
3.2 进程结构
Oracle的进程结构主要包括用户进程、服务器进程和后台进程。
(1)用户进程
用户进程是当用户连接数据库执行一个应用程序时创建的,用来完成用户所制定的任务。在Oracle数据库中,用户进程与数据库实例之间通过连接进行通信,该连接由硬件线路、网络协议和操作系统进程通信机制构成。会话则是用户到数据库的指定连接,用户连接到数据库时会话开始,直到用户断开连接或终止应用程序时结束。
(2)服务器进程
服务器进程是由Oracle自身创建的,用于处理连接到数据库实例的用户进程所提出的请求。当应用程序和Oracle运行在同一台机器上时,用户进程和对应的服务器进程可以合并以降低系统开销。然而,当它们运行在不同的计算机上时,用户进程总是通过不同的服务器进程连接到Oracle。
(3)后台进程
后台进程是在数据库实例启动时自动开始的,用于支持服务器进程的操作。后台进程的数量和类型取决于数据库的配置和操作需求。这些进程执行各种任务,如日志写入、进程监视、清理和恢复操作等,以确保数据库的正常运行和数据的完整性。
3.3 存储结构
Oracle的物理存储结构是由为数据库信息提供真实物理存储的操作系统文件决定的,主要包含数据文件、控制文件、联机重做日志文件等部分。以下是对这些组件的详细解释:
(1)数据文件:
数据文件是存储数据库数据的文件。
每一个Oracle数据库都有一个或多个物理的数据文件,所有数据文件大小的和构成了数据库的大小。一个表空间由一个或多个数据文件组成,而一个数据文件只对应一个数据库。数据库的逻辑结构的数据(如表、视图等)都实在地存储在数据库的数据文件中。一个模式对象(schema object)的物理数据可以存储在构成表空间的一个或多个数据文件上,而一个模式对象也可以存储在其所在表空间的一个或多个数据文件中。这意味着一个模式对象可以跨越一个或多个数据文件。
数据文件可以通过设置参数实现自动扩展的功能。
(2)控制文件:
控制文件记录了数据库的结构信息,用于控制数据库的物理结构。
控制文件中的数据库结构信息包括数据库名称、数据库建立日期、数据库中数据文件与日志文件的名称及位置、表空间信息、归档日志信息、当前的日志序列号、检查点信息等。
一个Oracle数据库通常包含多个控制文件,在安装Oracle系统时,会自动创建控制文件。在数据库的使用过程中,数据库需要不断更新控制文件。一旦控制文件受损,数据库将无法正常工作。
(3)日志文件:
①联机重做日志文件:
重做日志文件用于存储对数据库所做的更改(重做条目),以确保在发生故障时,可以恢复数据库到一致的状态。
②归档重做日志文件:
当数据库运行在归档模式下,写满的重做日志文件会被保存到指定的位置,这些被保存的重做日志文件的集合称为归档重做日志文件。
归档过程有助于在发生故障时恢复数据库到特定的时间点。
③除了重做日志文件外,Oracle还可能有其他类型的日志文件,如监听器日志、审计日志等,用于记录数据库运行过程中的各种活动和事件。
(4)参数文件:
参数文件记录了数据库的显式参数设置,如内存分配、进程数量等。数据库启动时会根据参数文件中的设置来创建并启动实例。
(5)跟踪文件和警告文件:
当数据库遇到错误或异常时,会生成跟踪文件来记录详细的错误信息,帮助管理员进行问题诊断。警告文件则记录了数据库运行过程中的重要事件和消息。
(6)备份文件:
数据库的备份文件,如RMAN备份、数据文件备份等,也是物理存储结构的一部分。这些备份文件用于在数据丢失或损坏时进行恢复。
(7)密码文件:
密码文件用于远程登录数据库时的身份验证。它包含了允许远程访问的用户的用户名和密码的哈希值。
(纯文字描述过于抽象,后续会补充示意图)(咕咕咕~)
四. 数据字典
Oracle的数据字典是存放有关数据库信息的核心地方。它是一组提供有关数据库信息的表和视图的集合,这些表和视图是只读的。数据字典随着数据库的建立而建立,当数据库执行特定动作时,数据字典也会自动更新。数据字典中几乎包含了所有的系统信息和对象信息,例如对象的名称、类型、所有者、结构、列、索引等。
4.1 数据字典包含的内容
(1)表、视图、索引、聚簇、同义词、序列、过程、函数、包、 触发器以及其他数据库对象。
(2)数据库的空间分配和使用情况,包括数据文件的使用情况,表空间的分配和使用,段的分配和使用。
(3)字段的缺省值:数据库中各个字段的缺省值信息。
(4)完整性约束信息:主键、外键、唯一约束、检查约束、非空约束。
(5)Oracle用户名称、角色、权限等信息:数据库用户的详细信息、角色的定义和权限、用户权限的分配情况。
(6)审计信息:记录了对数据库的各种操作,如登录、访问对象等的审计信息。
(7)其他数据库信息:数据库的配置参数、数据库的运行状态、数据库的版本信息以及其他与数据库相关的元数据。
4.2 数据字典层次
Oracle数据字典的四个层次主要包括内部RDBMS表(X表)、基础数据字典表、数据字典视图和动态性能视图(V)。
(1)内部RDBMS表(X表)
这是Oracle数据库的核心部分,用于跟踪数据库内部信息,维持数据库的正常运行。这些表在数据库启动时由Oracle应用程序动态创建,不允许SYSDBA之外的用户直接访问。X表是加密命名的,且Oracle官方文档不做说明。
(2)基础数据字典表
用以存储表、索引、约束以及其他数据库结构的信息,这些对象通常以“”结尾(例如:TAB、OBJ、TS等)。在创建数据库时,通过运行$ORACLE_HOME/rdbms/admin/sql.bsq脚本来创建这些表。
(3)数据字典视图
基于基础数据字典表,为用户提供了更加友好的接口来查询数据库的结构和对象信息。
(4)动态性能视图(V$视图)
这些视图提供了关于数据库运行时的动态性能信息,如当前的内存使用情况、进程状态等。这些视图对于数据库管理员和性能调优专家来说非常有用。
4.3 数据字典查询
SELECT TABLE_NAME FROM all_tables WHERE OWNER = 'LAZZYCAT';
//查询LAZZYCAT用户下所有表
SELECT * FROM all_tab_columns WHERE TABLE_NAME = 'TABLE_LOG_TEMP';
//列出TABLE_LOG_TEMP表中所有字段
SELECT * FROM all_ind_columns WHERE TABLE_NAME = 'TABLE_LOG_TEMP'
//列出TABLE_LOG_TEMP表的索引列
SELECT * FROM all_constraints WHERE TABLE_NAME = 'TABLE_LOG_TEMP'
//列出TABLE_LOG_TEMP表的约束