Использование расширенных типов данных

Скачать драйвер JDBC

В Microsoft JDBC Driver для SQL Server расширенные типы данных JDBC служат для преобразования типов данных SQL Server в форматы, распознаваемые языком программирования Java.

Remarks

В следующей таблице перечислены все стандартные сопоставления между расширенными типами данных SQL Server, типами данных JDBC и типами данных языка программирования Java.

Типы SQL Server Типы JDBC (java.sql.Types) Типы языка Java
varbinary(max)

Изображение
LONGVARBINARY byte[] (по умолчанию), Blob, InputStream, String
text

varchar(max)
LONGVARCHAR String (по умолчанию), Clob, InputStream
ntext

nvarchar(max)
LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String (default), Clob, NClob
Xml LONGVARCHAR

SQLXML
String (default), InputStream, Clob, byte[], Blob, SQLXML
Пользовательский тип1 VARBINARY String (по умолчанию), byte[], InputStream
sqlvariant SQLVARIANT Объект
geometry

geography
VARBINARY byte[]

1Microsoft JDBC Driver для SQL Server поддерживает отправку и получение пользовательских типов CLR в виде двоичных данных, но не поддерживает работу с метаданными 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 КБ. В SQL Server введен описатель max для типов данных varchar, nvarchar и varbinary, который обеспечивает хранение значений размером до 2^31 байт. Столбцы таблицы и переменные Transact-SQL могут указывать типы данных varchar(max), nvarchar(max) и varbinary(max).

В большинстве случаев работа с типами данных большого объема предполагает их извлечение из базы данных или добавление в базу данных. В следующих разделах описываются различные способы выполнения этих задач.

Извлечение типов данных большого объема из базы данных

Извлечь тип недвоичных данных большого объема, например типа данных varchar(max) из базы данных, можно путем считывания данных в виде потока символов. В следующем примере для извлечения данных из базы данных и их возвращения в виде результирующего набора используется метод executeQuery класса SQLServerStatement. Затем для считывания данных большого объема из результирующего набора используется метод getCharacterStream класса SQLServerResultSet.

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. Однако это менее эффективно, чем два предыдущих способа.

Добавление типов данных большого объема в базу данных

Драйвер 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 для загрузки больших объемов данных неэффективны.

Изменение типов данных большого объема в базе данных

В большинстве случаев для обновления или изменения больших значений в базе данных рекомендуется передавать параметры через классы SQLServerPreparedStatement и SQLServerCallableStatement с помощью таких команд Transact-SQL, как UPDATE, 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.

Дополнительные сведения о типах данных большого объема ищите в разделе «Использование типов данных большого объема» электронной документации по Microsoft SQL Server.

Тип данных XML

SQL Server содержит тип данных xml, который позволяет хранить XML-документы и фрагменты в базе данных SQL Server. Тип данных xml — это встроенный в SQL Server тип данных, несколько напоминающий другие встроенные типы данных, такие как int и varchar. Аналогично другим встроенным типам типы данных xml можно использовать следующим образом: как тип столбца при создании таблицы, как тип переменной, тип параметра, тип возвращаемой функции, а также в функциях CAST и CONVERT Transact-SQL.

В драйвере JDBC тип данных xml может быть сопоставлен со строкой, байтовым массивом, потоком или объектом CLOB, BLOB или SQLXML. По умолчанию задана строка. Для драйвера JDBC, начиная с версии 2.0, обеспечивается поддержка API-интерфейса JDBC 4.0, что позволяет использовать интерфейс SQLXML. Интерфейс SQLXML определяет методы для обмена данными XML и их обработки. Тип данных SQLXML сопоставляется с типом данных SQL Serverxml. Дополнительные сведения о считывании XML-данных из реляционной базы данных и их записи в нее с типом данных Java SQLXML см. в руководстве по использованию данных XML.

Благодаря реализации типа данных xml в драйвере JDBC обеспечена поддержка следующих возможностей:

  • Доступ к XML как к стандартным строкам Java UTF-16 для большинства общепринятых методик программирования.

  • Ввод UTF-8 и других XML-данных с 8-битным кодированием.

  • Доступ к XML как к байтовому массиву с ведущей меткой следования байтов (BOM) при кодировании в UTF-16 для взаимообмена с другими средствами обработками XML и файлами на диске.

SQL Server требует для XML в кодировке UTF-16 ведущую метку порядка байтов (BOM). Приложение должно использовать эту метку при указании значений параметров XML в виде байтовых массивов. SQL Server всегда выводит XML-значения как строки в кодировке UTF-16 без метки порядка байтов и без внедренного объявления кодировки. Если значения XML извлекаются в формате byte[], BinaryStream или Blob, то для значения ожидается метка следования байтов UTF-16.

Дополнительные сведения о типе данных xml можно найти в разделе "Тип данных XML" электронной документации по SQL Server.

Определяемый пользователем тип данных

Введение пользовательских типов (UDT) в SQL Server 2005 (9.x) совершенствует систему типов SQL, позволяя пользователю сохранять объекты и настраиваемые структуры данных в базе данных SQL Server. Определяемые пользователем типы могут содержать несколько типов данных, и их поведение может отличаться от традиционных псевдонимов типов данных, которые состоят из одного системного типа данных SQL Server. Определяемые пользователем типы данных определяются с помощью любого из языков, которые поддерживаются средой Microsoft .NET CLR и формируют проверяемый код. Это языки Microsoft Visual C# и Visual Basic .NET. Данные предоставляются в виде полей и свойств класса или структуры на базе платформы .NET Framework, а особенности работы определяются методами класса или структуры.

В SQL Server пользовательские типы (UDT) можно применять в качестве идентификатора столбцов таблицы, как переменную в пакете Transact-SQL или как аргумент функции Transact-SQL либо хранимой процедуры.

Дополнительные сведения о применении пользовательских типов данных см. в разделе "Использование и изменение экземпляров пользовательских типов" в электронной документации по SQL Server.

Тип данных sql_variant

Дополнительные сведения см. в статье об использовании типа данных Sql_variant.

Типы пространственных данных

Дополнительные сведения см. в статье об использовании пространственных типов данных.

См. также раздел

Основные сведения о типах данных JDBC Driver