Поделиться через


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

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

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

Замечания

В следующей таблице перечислены сопоставления по умолчанию между расширенными типами данных языка 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 Object
geometry

география
VARBINARY byte[]

1 Драйвер Microsoft JDBC для 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 представляет максимальный описатель для типов данных 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 сопоставляется с типом данных XML SQL Server. Дополнительные сведения о считывании XML-данных из реляционной базы данных и их записи в нее с типом данных Java SQLXML см. в руководстве по использованию данных XML.

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

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

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

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

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

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

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

Введение определяемых пользователем типов (определяемых пользователем типов) в 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