创建表或向数据库中的表添加新列时,将为列定义特定数据类型。数据类型确定以下内容:
- 可以在该列中存储哪些值
- 可以在该列中对数据执行哪些操作
- 如何在数据库中存储该列的数据
ArcGIS 使用特定数据类型。通过数据库连接或查询图层访问数据库表时,ArcGIS 将过滤掉任何不受支持的数据类型。ArcGIS 不会显示不受支持的数据类型并且您无法通过 ArcGIS 编辑这些数据类型。同样,使用 ArcGIS 将包含不受支持的数据类型的表从一个数据库复制和粘贴到另一个数据库时,ArcGIS 只粘贴使用受支持的数据类型的列。
下表的第一列列出了 ArcGIS 数据类型。第二列列出了 ArcGIS 创建的 Oracle 数据类型。第三列显示了在查看 ArcGIS 外创建的表时哪些其他 Oracle 数据类型(如果有)会映射到 ArcGIS 数据类型。最后一列提供了所需的附加信息。
ArcGIS 数据类型 | 创建的 Oracle 数据类型 | 其他可查看的 Oracle 数据类型 | 注释 |
---|---|---|---|
BLOB | BLOB | ||
DATE | TIMESTAMP | ||
DOUBLE | NUMBER(38,8) | NUMBER(p,s) | ArcGIS 中指定的精度和小数位数可以影响在数据库中创建的结果数据类型。有关详细信息,请参阅 ArcGIS 字段数据类型。 |
FLOAT | NUMBER(38,8) | NUMBER(p,s) | ArcGIS 中指定的精度和小数位数可以影响在数据库中创建的结果数据类型。有关详细信息,请参阅 ArcGIS 字段数据类型。 |
GEOMETRY | ST_GEOMETRY, NUMBER(38), or SDO_GEOMETRY | 创建的 Oracle 数据类型取决于创建要素类时指定的几何存储。压缩二进制或熟知二进制(仅地理数据库)= NUMBER(38);Oracle Spatial = SDO_GEOMETRY;空间类型 = ST_GEOMETRY。 要在数据库中使用 ST_Geometry 必须先进行安装。 | |
GLOBAL ID | CHAR or NCHAR (UUID LEN) | 仅地理数据库支持。 如果将用于指定表创建的配置关键字的参数 UNICODE_STRING 设置为 TRUE,那么唯一标识符字段将创建为 NCHAR 字段。 | |
GUID | CHAR or NCHAR (UUID LEN) | 如果将用于创建表的配置关键字的参数 UNICODE_STRING 设置为 TRUE,那么地理数据库中唯一标识符字段将创建为 NCHAR 字段。 | |
LONG INTEGER | NUMBER(38) | NUMBER(n) | 值 n 的取值范围是 5 到 10。如果使用 ArcGIS for Desktop 或 ArcObjects 创建并将精度设置为 0,则会在数据库中创建 NUMBER(38),否则将使用指定的精度。 |
OBJECT ID | 在企业级地理数据库中创建时为 NUMBER(38) 下述情况创建的 NUMBER(38) 将具有序列和触发器:
如果在 Oracle 12c 数据库中使用 ArcGIS 创建要素类或表,或使用添加增量 ID 字段地理处理工具将 ID 字段添加到 Oracle 12c 数据库的表格内,则始终会生成 NUMBER(38) 作为标识。 | ArcGIS 类型 ObjectID 是表(或要素类)的注册行 ID 列。每个表只能存在一个 ObjectID。 | |
RASTER | BLOB, LONG RAW, SDO_GEORASTER, or ST_RASTER | 仅地理数据库支持栅格。栅格字段所使用的数据类型取决于创建栅格目录、栅格数据集或镶嵌数据集时指定的配置关键字。 | |
SHORT INTEGER | NUMBER(5) | NUMBER(n) | 值 n 的取值范围是 1 到 5。但是,短整型列只可存储介于 -32,768 和 32,767 之间的值。即使数字的精度为 5,也无法在短整型列中存储大于 32,767 或小于 -32,768 的数字。 使用 ArcGIS for Desktop 创建时,n = 5。这种情况下,您可以存储介于允许范围之内的短整型值。 |
TEXT | VARCHAR2、CLOB、NVARCHAR2 或 NCLOB |
文本数据类型
当您选择将文本字段包含在使用 ArcGIS 创建的表中时,如果未将数据库设置为使用 Unicode 编码,则使用 VARCHAR2 数据类型。如果将文本字段的大小设置为大于 4000,且未将数据库设置为使用 Unicode 编码,则 Oracle 数据类型将为 CLOB。
如果将数据库设置为使用 Unicode 编码,那么文本字段将创建为 NVARCHAR2。(这是 Oracle 中地理数据库的默认设置。)如果将文本字段的大小设置为大于 2,000,且将数据库设置为使用 Unicode 编码,那么 Oracle 数据类型将为 NCLOB。
几何数据类型
如表中所示,ArcGIS 可在 Oracle 中创建并处理三种几何数据类型:Esri ST_Geometry、Oracle SDO_Geometry 和压缩二进制。压缩二进制几何存储仅可用在地理数据库中。
ST_Geometry
以下是 ST_Geometry 空间数据类型的常规描述。有关特定于 Oracle 实施的信息,请参阅 Oracle 中的 ST_Geometry。
ST_Geometry 数据类型遵循用户定义数据类型 (UDT) 的 SQL 3 规范,用于创建可存储空间数据(如地标、街道或土地宗地的位置)的列。该数据类型可通过符合国际标准化组织 (ISO) 和开放地理空间联盟 (OGC) 标准的结构化查询语言 (SQL) 来访问地理数据库和数据库。通过向表示地理要素的对象(点、线及面)提供存储空间,此存储类型扩展了数据库的功能。此存储类型旨在充分利用数据库资源,与数据库要素(如复制与分区)兼容,以及快速访问空间数据。
虽然可以将列定义为类型 ST_Geometry,但是您无法将 ST_Geometry 值插入此列,因为无法对 ST_Geometry 进行实例化。相反,您可以插入子类值。
ST_Geometry 本身是抽象的、无法实例化的超类。但其子类可以实例化。实例化的数据类型是可定义为表列的数据类型,并且其类型值插入表列之中。
下图说明了 ST_Geometry 数据类型及其子类的等级。
ST_Geometry 的子类分为两类:基础几何子类和同类集合子类。基础几何包括 ST_Point、ST_LineString 和 ST_Polygon,而同类集合包括 ST_MultiPoint、ST_MultiLineString 和 ST_MultiPolygon。与名称的含义一致,同类集合是基础几何的集合。除了共享基础几何属性之外,同类集合还具有某些自身的属性。
每个子类都存储其名称所指的几何类型;例如,ST_MultiPoint 存储多点。下表是子类及其说明的列表:
子类型 | 描述 |
---|---|
ST_Point |
|
ST_LineString |
|
ST_Polygon |
|
ST_MultiPoint |
|
ST_MultiLineString |
|
ST_MultiPolygon |
|
SDO_Geometry
使用 Oracle 的可扩展对象关系型系统可实现 SDO_Geometry。可以通过 Oracle 提供的两个主要选项来使用 SDO_Geometry 类型:
- Oracle Spatial 是 Oracle 数据库企业版的一项可选功能。除提供 SDO_Geometry 类型外,还提供若干个其他地理空间功能。
- Oracle Locator 提供 Oracle Spatial 的子功能。它作为一项标准功能包括在 Oracle 数据库标准版和企业版中。除其他功能外,Oracle Locator 还为该内容提供 Oracle Spatial 几何类型(即 SDO_Geometry)和 SQL API。
ArcGIS 支持 SDO_Geometry,并将其作为一种用于存储空间数据的可选方法。确切地说,可使用 Oracle Spatial 或 Oracle Locator 几何来存储和管理企业级地理数据库或 Oracle 数据库中数据集的要素和栅格内容。
SDO_Geometry 可存储几何信息,包括几何类型、空间参考 ID、插值类型(直线与曲线)及坐标值。地理数据库中的 SDO_Geometry 类型支持单个点、多部分 (multipart) 点、线和面几何。根据 OpenGIS 简单要素规范中的定义,可以将几何描述为在坐标之间进行线性插值。还可以通过圆曲线或结合使用两种插值方法来构造几何。使用 Oracle 对象关系型的 SQL 接口,应用程序可完成对 SDO_Geometry 类型内容的插入、更新及提取等正确操作。应用程序还要确保所有几何内容均符合 Oracle Spatial 文档中定义的规则。Oracle 可提供插入几何后执行的几何验证例程。另外,从 Oracle 11.1.0.7 开始,在插入索引时将进行几何验证。
有关每个 SDO_Geometry 列的信息都应记录到 Oracle Spatial 元数据模式中,但 Oracle Spatial 不会自动执行此操作。(Oracle Spatial 元数据模式作为每个模式的 USER_SDO_GEOM_METADATA 视图显示。) 创建 SDO_Geometry 列的软件必须为这些列插入元数据。ArcGIS 会为其创建的任何 SDO_Geometry 要素类执行此操作。元数据包含空间列名称、所属表和所有者的名称、Oracle 空间参考标识符 (SRID)、维数、每个维度的范围及其坐标容差。
使用空间索引可以根据要素的几何位置快速访问要素。对于 SDO_Geometry,创建 R 树空间索引通常是最有效和最便捷的方式,而且它是 Oracle 推荐在大多数情况下使用的索引类型。可以借助 Oracle Spatial 提供的 Spatial Index Advisor 工具来确定给定表的最佳空间索引类型。此外,还可以参阅《Oracle Spatial 用户指南和参考》详细了解支持的空间索引类型、各种类型的创建方式以及不同空间索引方法的优势和局限性。
Oracle Spatial 对 SQL 进行了扩展,提供了用于初级过滤和二级过滤的空间搜索功能。在 SQL 查询中包含 SDO_FILTER 函数可利用空间索引执行初步空间搜索。空间谓词(如 SDO_RELATE 和 SDO_CONTAINS)会返回 SDO_Geometry 对象对的二级关系。Oracle Spatial 具有可更改 SDO_Geometry 值的形式的空间变换函数。例如,使用 SDO_BUFFER 函数计算新 SDO_Geometry 对象的坐标时,会将该对象视为在原始几何给定距离范围内的缓冲多边形。其他空间变换函数包括 SDO_DIFFERENCE 和 SDO_INTERSECTION。
Oracle Spatial 通过使用 SRID 值提供对大量预定义坐标参照系的访问。存储在 SDO_Geometry 对象中的 SRID 值为存储在该对象中的几何指定了坐标参考。如果 SDO_Geometry 对象中的 SRID 值不为 NULL,则此值即为包含每个 SRID 详细信息的表的外键。该表名为 MDSYS.CS_SRS。SDO_TRANSFORM 函数使用空间参考 ID 建立坐标参考变换。ArcGIS 在创建空间参考时也会使用此信息。
压缩二进制
Esri 压缩二进制存储类型使用二进制存储机制存储要素几何。压缩二进制要素类由三个表组成:业务表、要素表和空间索引表。
验证几何后,客户端应用程序将压缩该几何并将其发送到地理数据库,此几何以压缩二进制格式存储在此地理数据库的要素表(或 F 表)中。在客户端上压缩几何可避免数据库服务器执行此项任务,从而降低发送几何所需的传输时间。这还能使存储数据所需的空间降低 40% 之多,从而可以有效地存储和检索空间数据。
业务表包含属性和空间列。空间列是要素表和空间索引表的键。
业务表和要素表之间的关系通过空间列和要素 ID (FID) 列来管理。此键由 ArcGIS 维护,并且是唯一的。
栅格数据类型
您可将 BLOB、Long Raw、ST_Raster 或 SDO_GeoRaster 用于栅格数据集、栅格目录或镶嵌数据集的栅格列。
有关 Oracle 中 BLOB 的信息,请参阅本主题的 BLOB 部分。
Oracle 已弃用 Long Raw 数据类型;您应避免在准备阶段使用此数据类型,因为 Oracle 不再支持此类型。虽然 Long Raw 仍可用,但最好不要使用它,如果一定要使用 Long Raw,最终必须将其迁移到其他存储类型。
以下两个小节将描述其余的栅格数据类型。
ST_Raster
ST_Raster 是一种用户定义的数据类型,可将其安装在企业级地理数据库中以对栅格数据进行 SQL 访问。
要使用 ST_Raster,您必须在数据库中对其进行配置。请参阅在 Oracle 中安装 ST_Raster。
有关如何定义 ST_Raster 对象类型的详细信息,请参阅 ST_Raster 数据类型。
SDO_GeoRaster
使用 Oracle 的可扩展对象关系型系统可实现 Oracle Spatial 栅格数据类型 SDO_GeoRaster。SDO_GeoRaster 类型可存储栅格信息,包括像素类型、空间参考 ID 及像素值。
SDO_GeoRaster 类型支持所有的 Esri 像素类型:1 位至 64 位、有符号、无符号及浮点型。ArcGIS 支持使用 Oracle Spatial 的数据类型 SDO_GeoRaster 作为存储栅格数据的选项。
在创建包含 Oracle SDO_GeoRaster 列的表之后,ArcGIS 会填充所需的 Oracle 元数据模式。应用程序(如 ArcGIS)的工作就是执行此任务,因为 Oracle 不会自动执行此任务。如果注册一个包含由第三方产品创建的 Oracle SDO_GEORASTER 列的表,则该产品的职责就是针对 SDO_GEORASTER 列填充合适的 Oracle 元数据模式。
有关在地理数据库中使用 SDO_GeoRaster 的已知限制条件
以下是限制条件的列表,在将企业级地理数据库中的栅格数据存储为 SDO_GeoRaster 格式时,请时刻注意这些限制条件。
- Oracle 不支持 SDO_GeoRaster 的分段更新。因此,无法将影像文件镶嵌进以 SDO_GeoRaster 格式存储的现有栅格数据集中。
- 在插入数据期间不能构建金字塔。在将影像数据插入 SDO_GeoRaster 后,需要对其单独进行更新方可构建金字塔。因此,应该让用于创建栅格数据集或栅格目录的任何 ArcGIS 地理处理工具对话框中的“构建金字塔”复选框始终处于取消选中状态。
- 由于 Oracle 缺陷 12537431,不能使用 Oracle 11g R2 数据库中的 SDO_GeoRaster 存储。如果要使用 SDO_GeoRaster 存储,请使用 Oracle 11g R1 或更高版本。
- Oracle 以波段集成架构来实现 SDO_GeoRaster。因此无法添加或删除栅格数据集的各个波段。
- ArcGIS 不支持表中的多个栅格列。包含多个 SDO_GeoRaster 列的表应通过只包含一个 SDO_GeoRaster 列的视图进行访问。创建表的视图并在视图定义中只包含一个 SDO_GeoRaster 列。
- 在地理数据库中使用 SDO_GeoRaster 存储时,不支持 nodata 位掩码。因此,无法对非方形常规数据构建金字塔。
BLOB
在数据库管理系统 (DBMS) 行业,BLOB 是二进制大对象的英文首字母缩写。几年前 Oracle 公司开始实施 BLOB 列,用 BLOB 列取代了用于存储二进制数据的 LONG RAW 技术。
BLOB 数据类型的结构分为三个基本部分:BLOB 列、LOB 段和 LOB 索引。如果 BLOB 列存储 LOB 定位器(36 个字节)并在行内存储二进制数据(如果二进制数据少于 3965 个字节且没有对该列禁用行内存储)。
如果二进制数据超过 3964 个字节,则不会分配 BLOB 列的行内存储空间,并且 LOB 定位器将引用存储在 LOB 段中的二进制数据。
因此,启用行内存储时 BLOB 列中所存储的值始终至少为 36 个字节(分配给 LOB 定位器的空间)并且可能高达 4000 个字节(分配给 LOB 定位器的组合空间和可分配给行内所存储的二进制数据的最大空间)。
LOB 段分为许多区段。区段大小必须是 Oracle 数据块大小的倍数。例如,如果数据块大小为 8K,则可以使用 8K 的最小区段大小来创建 LOB 段。如果存储在 LOB 段内的数据长度为 5000 个字节,那么由于该数据量超过 3964 个字节且区段大小为 8K(或 8192 个字节),所以这些数据被存储到了 LOB 段中。在这种情况下,仍有 3192 个字节的 LOB 段区段未用。将数据从 LONG RAW 转换为 BLOB 将导致所需空间量增大,由于 LOB 段中出现未使用空间,而使增加量可能高达 30%。如果数据超过 3964 个字节(BLOB 列的行内存储阈值),这种情况就不可避免。
8K 的区段大小可提供最佳的 I/O 性能,同时使浪费的空间量最小。16K 的区段大小比 8K 的区段大小浪费的空间量大。因此,为避免空间损失,建议您使用 8K 数据块大小对当前具有 16K 数据块大小的数据库重新进行创建,或者,如果无法重新创建,则可在已使用 8K 块大小创建的表空间中创建 LOB 段。为此,您需要在 Oracle 系统全局区 (SGA) 中分配 8K 缓冲器高缓。
据发现,4K 和 2K 的区段大小浪费的空间量较少,但由于 I/O 成本增加而不会使用它们。
仅当 LOB 定位器寻址的区段数超过 12 时,才会使用 LOB 索引;否则,前 12 个区段由 LOB 定位器来寻址。
以下三幅图说明了存储在 BLOB 列中的二进制数据的三种可能存储情况。在第一种情况中,3000 个字节的二进制数据存储在行内,这是因为 3000 个字节小于 3965 个字节(行内存储阈值)。如果未对 BLOB 列禁用行内存储,则不会使用 LOB 段和 LOB 索引。通常,这会使 BLOB 数据提取速度加快,因为 Oracle 无需访问 LOB 段或 LOB 索引而使 I/O 操作次数减少。
下一幅图说明了第二种情况,二进制数据大于 3964 个字节(在本例中,数据为 81920 个字节),不适合在行内存储。因此,LOB 定位器引用存储在 LOB 段中的二进制数据。由于二进制数据在 LOB 段中占用的区段数低于 12 个,因此 LOB 定位器会存储其地址。在这种情况下,不使用 LOB 索引。
在最后一幅图中,二进制数据非常大(106496 个字节),需要使用 LOB 索引。在本例中,二进制数据超过行内存储且在 LOB 段内需要 12 个以上的区段来存储该数据。对于这么大的数据,LOB 定位器会引用 LOB 索引来获得 LOB 段内区段的位置。对于矢量数据来说这种情况极为罕见,而对于栅格数据则可避免发生这种情况。
有关设置 BLOB 存储的信息,请参阅 Oracle 配置参数。