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


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

Скачать драйвер 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)
Строка (по умолчанию), Clob, NClob
xml LONGVARCHAR

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

география
VARBINARY byte[]
JSON (формат обмена данными JavaScript) microsoft.sql.Types.JSON String (по умолчанию), InputStream
вектор microsoft.sql.Types.VECTOR microsoft.sql.Vector

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 Driver версии 2.0 и более поздних версиях драйвер JDBC предоставляет поддержку 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. Приложение должно предоставить ведущую BOM, если значения параметров XML предоставляются в виде массивов байтов. SQL Server всегда выводит XML-значения в виде строк UTF-16 без объявления BOM или встроенной кодировки. Когда XML-значения извлекаются как байт[], BinaryStream или BLOB-объект, объект BOM UTF-16 добавляется к значению.

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

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

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

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

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

Тип данных sql_variant

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

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

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

Тип данных JSON

Сведения о типе данных JSON см. в разделе "Тип данных JSON".

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

Сведения о типе векторных данных см. в разделе "Вектор данных".

См. также

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