使用高级数据类型

下载 JDBC 驱动程序

Microsoft JDBC Driver for SQL Server 使用 JDBC 高级数据类型将 SQL Server 数据类型转换为 Java 编程语言理解的格式。

备注

下表列出了高级 SQL Server、JDBC 和 Java 编程语言数据类型之间的默认映射。

SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型
varbinary(max)

图像
LONGVARBINARY byte[](默认)、Blob、InputStream、String
文本消息

varchar(max)
LONGVARCHAR String(默认)、Clob、InputStream
ntext

nvarchar(max)
LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
字符串(默认值)、Clob、NClob
xml LONGVARCHAR

SQLXML
字符串(默认值)、InputStream、Clob、byte[]、Blob、SQLXML
Udt1 VARBINARY String(默认)、byte[]、InputStream
sqlvariant SQLVARIANT 对象
几何

地理
VARBINARY byte[]
json microsoft.sql.Types.JSON 字符串(默认值),InputStream
向量 microsoft.sql.Types.VECTOR microsoft.sql.Vector

1Microsoft JDBC Driver for SQL Server 支持以二进制数据的格式发送和检索 CLR UDT,但不支持操作 CLR 元数据。

以下部分提供了关于如何使用 JDBC 驱动程序和高级数据类型的示例。

BLOB、CLOB 和 NCLOB 数据类型

JDBC 驱动程序实现了 java.sql.Blob、java.sql.Clob 和 java.sql.NClob 接口的所有方法。

注意

CLOB 值可与 SQL Server 2005 (9.x)(或更高版本)大值数据类型一同使用。 具体来说,CLOB 类型可以与 varchar(max) 和 nvarchar(max) 数据类型一起使用,BLOB 类型可以与 varbinary(max) 和 image 数据类型一起使用,NCLOB 类型可与 ntext 和 nvarchar(max) 一起使用。

大值数据类型

在 SQL Server 的早期版本中,使用大值数据类型需要特殊处理。 大值数据类型是超过最大行大小 8 KB 的类型。 SQL Server 为 varchar、nvarchar 和 varbinary 数据类型引入一个 max 说明符,以允许存储最长可达 2^31 个字节的值 。 表列和 Transact-SQL 变量可以指定 varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型。

大值类型主要用于以下场合:从数据库中检索这些类型,或者将其添加到数据库。 以下部分介绍了完成这些任务的几种不同方法。

从数据库中检索大值类型

从数据库中检索非二进制大型值数据类型(例如 varchar(max) 数据类型)时,一种方法是以字符流的形式读取该数据。 以下实例使用了 SQLServerStatement 类的 executeQuery 方法从数据库中检索数据,并将其返回为结果集。 然后,使用 SQLServerResultSet 类的 getCharacterStream 方法从结果集读取大值数据。

ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");
rs.next();
Reader reader = rs.getCharacterStream(2);

注意

此相同方法还可用于 text 、ntext 和 nvarchar (max) 数据类型。

从数据库中检索二进制大值数据类型(例如 varbinary(max))时,可采用多种方法进行操作 。 最有效的方法是将数据作为二进制流读取,如以下示例所示:

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
InputStream is = rs.getBinaryStream(2);

还可以使用 getBytes 方法将数据读取为字节数组,如示例中所示:

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
byte [] b = rs.getBytes(2);

注意

还可以将数据作为 BLOB 进行读取。 但是,读取 BLOB 的效率低于前面所示的两种方法。

向数据库添加大值类型

通过 JDBC 驱动程序上载较大数据适用于内存大小合适的情况,而对于大于内存的情况,流是主要选择。 但是,最有效的上载较大数据的方法是通过流接口。

使用字符串或字节也是一个选项,如以下示例所示:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");
pstmt.setInt(1, 1);
pstmt.setString(2, htmlStr);
pstmt.executeUpdate();

注意

还可以将这种方法用于存储在 text 、ntext 和 nvarchar(max) 列中的值。

如果在服务器上具有图像库并且必须将整个二进制图像文件上传到 varbinary(max) 列,则适用于 JDBC 驱动程序的最有效方法是直接使用流,如下所示 :

try (PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (Col1, Col2) VALUES(?,?)")) {
  File inputFile = new File("CLOBFile20mb.jpg");
  try (FileInputStream inStream = new FileInputStream(inputFile)) {
    int id = 1;
    pstmt.setInt(1,id);
    pstmt.setBinaryStream(2, inStream);
    pstmt.executeUpdate();
  }
}

注意

使用 CLOB 或 BLOB 方法并不是上传大数据的有效方法。

修改数据库中的大值类型

在大多数情况下,用于在数据库上更新或修改较大值的推荐方法是使用 Transact-SQL 命令(如 UPDATE)通过 WRITESUBSTRING 类来传递参数。

如果必须替换大型文本文件(如存档 HTML 文件)中的单词实例,可以使用 Clob 对象,如以下示例所示:

String SQL = "SELECT * FROM test1;";
try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)
     ResultSet rs = stmt.executeQuery(SQL)) {
  rs.next();

  Clob clob = rs.getClob(2);
  long pos = clob.position("dog", 1);
  clob.setString(pos, "cat");
  rs.updateClob(2, clob);
  rs.updateRow();
}

此外,可以在服务器上完成全部工作,仅将参数传递到准备好的 UPDATE 语句。

有关大值类型的详细信息,请参阅 SQL Server 联机丛书中的“使用大值类型”。

XML 数据类型

SQL Server 提供了 xml 数据类型,该数据类型允许将 XML 文档和片段存储在 SQL Server 数据库中 。 xml 数据类型是 SQL Server 中的内置数据类型,在某些方面类似于其他内置类型(如 int 和 varchar) 。 对于其他内置类型,在作为变量类型、参数类型、函数返回类型或在 Transact-SQL CAST 和 CONVERT 函数中创建表时,可以使用 xml 数据类型作为列类型。

在 JDBC 驱动程序中,xml 数据类型可以映射为字符串、字节数组、流、CLOB、BLOB 或 SQLXML 对象 。 String 为默认值。 在 JDBC 驱动程序版本 2.0 及或更高版本中,JDBC 驱动程序为 JDBC 4.0 API 提供支持,该 API 引入了 SQLXML 接口。 SQLXML 接口定义与 XML 数据交互以及操作 XML 数据的方法。 数据类型 SQLXML 映射到 SQL Serverxml 数据类型。 若要详细了解如何使用 SQLXML Java 数据类型从/向关系数据库读取和写入 XML 数据,请参阅支持 XML 数据

在 JDBC 驱动程序中实现 xml 数据类型为以下各项提供了支持 :

  • 在大多数常见的编程场景中,对作为标准 Java UTF-16 字符串的 XML 的访问

  • 输入以 UTF-8 和其他 8 格式进行编码的 XML

  • 为了可与其他 XML 处理器和磁盘文件进行互换而以 UTF-16 进行编码时,对作为带有前导 BOM 的字节数组的 XML 的访问

SQL Server 要求以 UTF-16 编码的 XML 具有前导 BOM。 当 XML 参数值作为字节数组提供时,应用程序必须提供前导 BOM。 SQL Server 始终以 UTF-16 字符串形式输出 XML 值,而不带有 BOM 或嵌入式编码声明。 当 XML 值作为字节[]、BinaryStream 或 Blob 检索时,UTF-16 BOM 将追加到值前面。

有关 xml 数据类型的详细信息,请参阅 SQL Server 联机丛书中的“xml 数据类型” 。

用户定义数据类型

通过允许在 SQL Server 数据库中存储对象和自定义数据结构,在 SQL Server 2005 (9.x) 中引入了用户定义的类型 (UDT),从而扩展了 SQL 类型系统。 UDT 可以包含多种数据类型并且可具有行为,这使它们不同于由单一 SQL Server 系统数据类型构成的传统别名数据类型。 UDT 通过使用Microsoft .NET 公共语言运行时 (CLR) 支持的任何语言来定义,这些语言生成可验证代码,包括 Microsoft Visual C# 和 Visual Basic .NET。 数据作为基于 .NET Framework 的类或结构的字段和属性公开,类或结构的方法定义行为。

在 SQL Server 中,UDT 可用作表的列定义、Transact-SQL 批处理中的变量或 Transact-SQL 函数或存储过程的参数。

有关用户定义的数据类型的详细信息,请参阅 SQL Server 联机丛书中的“使用和修改用户定义类型的实例”。

Sql_variant 数据类型

有关 sql_variant 数据类型的信息,请参阅使用 Sql_variant 数据类型

空间数据类型

有关 spatial 数据类型的信息,请参阅使用 Spatial 数据类型

JSON 数据类型

有关 JSON 数据类型的信息,请参阅 JSON 数据类型

矢量数据类型

有关矢量数据类型的信息,请参阅 Vector 数据类型

另请参阅

了解 JDBC 驱动程序数据类型