去 IOE 的前提是了解,才能谈去。Oracle 提供了22种数据类型,其中专门用于存储字符串的有6类。
字符串相关数据类型一览
- CHAR : 定长类型,用 空格 来填充保证达到最大的长度;最多存储 2000 字节信息。
- NCHAR : 与 CHAR 的差异是,支持 Unicode 格式的数据。
- VARCHAR2 : 即 VARCHAR,变长类型,末尾不填充 空格 ;最多 4000 字节。(12c 后,可支持32767字节)
- NVARCHAR2 : 与 VARCHAR2的差异是,支持 Unicode 格式的数据。
- RAW : 变长的二进制数据类型,不会发生数据字符集转换;最多 2000 字节。(12c 后,可支持32767字节)
- CLOB :10g后支持最多存储 (4GB-1)×(数据库块大小) 字节;受字符集转换的影响。
字符串语法
类型 | < SIZE> 的说明 | 示例 |
---|---|---|
VARCHAR2( < SIZE > < BYTE CHAR > ) | 字节或字符数,值域(1-4000),整数。 | A VARCHAR2( 20 BYTE ) |
CHAR( ) | 字节或字符数,值域(1-2000),整数。 | A CHAR( 20 CHAR ) |
NVARCHAR2( ) | 字符数,值域 >0,上限与字符集有关,整数。 | A NVARCHAR2( 20 ) |
NCHAR2( ) | 字符数,值域 >0,上限与字符集有关,整数。 | A NCHAR2( 20 ) |
字符串的存储
CHAR、 VARCHAR2、 NCHAR、 NVARCHAR2都采用相同的存储格式.即 CHAR、NCHAR 实际是基于VARCHAR2、NVARCHAR2实现。
底层数据格式设计
-
数据块中,分为2部分
- 数据长度:1-3个字节
- 数据本身
-
数据长度的设计
- 空数据即 NULL:单字节值 0xFF
- 长度≤ 250:单字节值 0x01-0xFA
-
长度>250:3字节值表示
- 第1标志字节固定为:0xFE
- 第2、3字节为实际长度
示例
- VARCHAR(20) Hello World
<- | 数 | 据 | -> | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
11 | H | e | l | l | o | W | o | r | l | d | |
^长度^ |
- CHAR(80) Hello World
<- | 数 | 据 | -> | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
80 | H | e | l | l | o | W | o | r | l | d | ||
^长度^ | ^69个空格^ |
注意点
- CHAR、NCHAR 空间效率利用率低,因占用空间与数据无关,仅于列定义有关。
- CHAR、NCHAR 容易给应用带来混乱,因数据末尾会补充若干空格,导致搜索结果经常非预期。
- 设置 MAX_STRING_SIZE为 EXTENDED后,VARCHAR2,NVARCHAR2,RAW才可以支持32767字节的存储。Oracle 默认是关闭,因启用后想再返回 STANDARD 会很痛苦。
查询工具推荐: DUMP 函数
作用:显示某个数据的数据类型代码、长度(单位为字节)及其在数据库内部实际存储的形式(字符集名),语法为:
DUMP( expression [, return_format] [, start_position] [,length])
扩展
- 关于字符集,请搜索 NLS(National Language Support)相关资料。