適用於 SQL Server 的 Microsoft JDBC 驅動程式會使用 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 | Object |
| 幾何 地理 |
VARBINARY | byte[] |
| JSON(JavaScript物件表示法) | microsoft.sql.Types.JSON | 字串 (預設)、InputStream |
| 向量 | microsoft.sql.Types.VECTOR | microsoft.sql.向量 |
1Microsoft JDBC Driver for SQL Server 支援以二進位資料形式傳送和擷取 CLR UDT,但不支援操作 CLR 中繼資料。
下列各節會提供如何使用 JDBC Driver 和進階資料類型的範例。
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 驅動程式上傳大型資料非常適合記憶體大小的情況,至於大於記憶體的情況,資料流則是最佳的選項。 不過,上傳大型資料的最有效方式,其實是透過資料流介面。
使用 String 或位元組也是一個選項,如下列範例所示:
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 方法並不是上傳大型資料的有效方法。
修改資料庫中的大數值類型
在多數情況下,在資料庫上更新或修改大數值的建議方法是使用 、 和 UPDATE 這類 Transact-SQL 命令,透過 WRITE 和 SUBSTRING 類別來傳遞參數。
如果您必須取代大型文字檔 (例如封存的 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 資料類型,可讓您在 SQL Server 資料庫中儲存 XML 文件和片段。 XML 資料類型是 SQL Server 中的內建資料類型,且在某些狀況下類似於其他內建類型,例如 int 和 varchar。 如同其他內建類型,您可以將 XML 資料類型當成建立資料表時的資料行類型;當成變數類型、參數類型或函數傳回類型使用;或在 Transact-SQL CAST 和 CONVERT 函數中使用。
在 JDBC 驅動程式中,xml 資料類型可以對應為字串、位元組陣列、資料流、CLOB、BLOB 或 SQLXML 物件。 字串為預設值。 在 JDBC 驅動程式 2.0 版及更新版本中,JDBC 驅動程式提供對 JDBC 4.0 API 的支援,其中引進了 SQLXML 介面。 SQLXML 介面會定義與 XML 資料互動和進行操作的方法。 SQLXML 資料類型會對應到 SQL Server xml 資料類型。 如需如何在具有 SQLXML Java 資料類型的關聯式資料庫中讀取和寫入 XML 資料的詳細資訊,請參閱支援 XML 資料。
JDBC 驅動程式中 xml 資料類型的實作提供下列項目的支援:
在大多數的一般程式設計案例中,存取 XML 作為標準 Java UTF-16 字串
UTF-8 和其他 8 位元編碼 XML 的輸入
採用 UTF-16 編碼以與其他 XML 處理器和磁碟檔案進行交換時,存取 XML 作為具有開頭 BOM 的位元組陣列
SQL Server 在 UTF-16 編碼的 XML 中需要開頭 BOM。 當 XML 參數值以位元組陣列形式提供時,應用程式必須提供前導 BOM。 SQL Server 一律會將 XML 值輸出為不含 BOM 或內嵌編碼宣告的 UTF-16 字串。 當 XML 值擷取為 byte[]、BinaryStream 或 Blob 時,UTF-16 BOM 會附加到值前面。
如需 xml 資料類型的詳細資訊,請參閱《SQL Server 線上叢書》中的<XML 資料類型>。
使用者定義資料類型
在 SQL Server 2005 (9.x) 中引入使用者定義型別 (UDT),可讓您在 SQL Server 資料庫中儲存物件和自訂資料結構,因而擴充 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 資料類型。
空間資料類型
如需有關空間資料類型的詳細資訊,請參閱使用空間資料類型。
JSON 數據類型
如需 JSON 資料類型的相關資訊,請參閱 JSON 資料類型。
向量資料類型
如需向量資料類型的相關資訊,請參閱 向量資料類型。