Основные сведения о преобразованиях типов данных

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

Чтобы упростить преобразование типов данных языка программирования Java в типы данных SQL Server, драйвер Microsoft JDBC для SQL Server предоставляет преобразования типов данных в соответствии со спецификацией JDBC. Повышенная гибкость обеспечивается тем, что следующие типы можно преобразовывать в прямом и обратном направлениях: Object, String и byte[].

Примечание.

При использовании Always Encrypted необходимо учитывать особые аспекты преобразования типов данных. Дополнительные сведения см. в разделе Об ошибках преобразования неподдерживаемых типов данных.

Преобразования метода считывания

На следующей диаграмме показана схема преобразования для драйвера JDBC, основанная на типах данных SQL Server, для методов get<Type>() класса SQLServerResultSet, а также поддерживаемое преобразование для методов get<Type> класса SQLServerCallableStatement.

JDBC to SQL Server type conversion matrix

Преобразования, поддерживаемые методами считывания драйвера JDBC, делятся на три категории.

  • Без потерь (x). Преобразования для случаев, когда тип метода считывания является таким же или меньшим, чем базовый тип сервера. Например, при вызове метода getBigDecimal для базового десятичного столбца сервера преобразование не потребуется.

  • С преобразованием (y). Преобразования из числовых типов сервера в типы языка Java, когда преобразование осуществляется стандартным образом и отвечает правилам преобразования языка Java. Для этих видов преобразования точность всегда усекается (никогда не округляется), а переполнение обрабатывается как остаток от деления на целевой тип, который меньше по размеру. Например, вызов метода getInt для базового десятичного столбца, который содержит значение "1.9999", вернет значение "1", а если базовое десятичное значение равно "3000000000", то произойдет переполнение значения int и результат будет равен "-1294967296".

  • В зависимости от данных (z). Для преобразования из базовых символьных типов в числовые типы требуется, чтобы символьные типы содержали значения, которые могут быть преобразованы в данный тип. Никакие другие преобразования не выполняются. Если значение слишком велико для метода считывания, то оно является недопустимым. Например, если вызывается метод getInt относительно столбца varchar(50), который содержит значение "53", значение возвращается в виде int, однако, если базовое значение ― "xyz" или "3000000000", возникает ошибка.

Если метод getString вызывается для типов данных столбца binary, varbinary, varbinary(max) или image, возвращается шестнадцатеричное строковое значение.

Преобразования метода обновления

Для данных на языке Java, передаваемых методам update<Type>() класса SQLServerResultSet, применяются следующие виды преобразования.

JDBCUpdaterConversions

Преобразования, поддерживаемые методами обновления драйвера JDBC, делятся на три категории.

  • Без потерь (x). Преобразования для случаев, когда тип обновления является таким же или меньшим, чем базовый тип сервера. Например, при вызове метода updateBidDecimal для базового десятичного столбца сервера преобразование не потребуется.

  • С преобразованием (y). Преобразования из числовых типов сервера в типы языка Java, когда преобразование осуществляется стандартным образом и отвечает правилам преобразования языка Java. Для этих видов преобразования точные значения всегда усекаются (и никогда не округляются), а при переполнении значение сокращается по модулю размера типа назначения (меньшего). Например, вызов метода updateDecimal для базового столбца int, который содержит значение "1.9999", вернет значение "1", а если базовое десятичное значение равно "3000000000", то произойдет переполнение значения int и результат будет равен "-1294967296".

  • В зависимости от данных (z). Для преобразования из типов данных базового источника в типы данных назначения требуется, чтобы содержащиеся значения могли быть преобразованы в типы назначения. Никакие другие преобразования не выполняются. Если значение слишком велико для метода считывания, то оно является недопустимым. Например, если вызывается метод updateString с аргументом «53» относительно столбца int, обновление завершается успешно; однако если базовое значение строки ― «foo» или «3000000000», возникает ошибка.

Если метод updateString вызывается для типов данных столбца binary, varbinary, varbinary(max) или image, он обрабатывает значение String в виде шестнадцатеричного строкового значения.

Если тип данных столбца SQL Server является XML, значение данных должно быть допустимым XML. При вызове методов updateBytes, updateBinaryStream или updateBlob значение данных должно быть шестнадцатеричным представлением для строки XML-символов. Пример:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

Обратите внимание, что метка следования байтов (BOM) является обязательной, если XML-символы имеют определенную кодировку.

Преобразования метода задания

Для данных на языке Javа, передаваемых методам set<Type>() класса SQLServerPreparedStatement и класса SQLServerCallableStatement, применяются следующие виды преобразования.

JDBCSetterConversions

Сервер проверяет любые виды преобразования и возвращает ошибку при неудачном завершении.

Если это тип данных String и значение превышает длину VARCHAR, то оно сопоставляется с LONGVARCHAR. Аналогичным образом NVARCHAR сопоставляется с LONGNVARCHAR, если значение превышает поддерживаемую длину NVARCHAR. То же относится и к byte[]. Значения, превышающие VARBINARY, становятся LONGVARBINARY.

Преобразования, поддерживаемые методами задания драйвера JDBC, делятся на две категории.

  • Без потерь (x). Преобразования для числовых случаев, когда тип задания является таким же или меньшим, чем базовый тип сервера. Например, при вызове метода setBigDecimal для базового десятичного столбца сервера преобразование не потребуется. В случае преобразования числовых данных в символьные тип данных Java numeric преобразуется в String. Например, вызов метода setDouble со значением "53" относительно столбца varchar(50) формирует символьное значение "53" в целевом столбце.

  • С преобразованием (y). Преобразования из типа Java numeric в базовый тип сервера numeric, меньший по размеру. Это преобразование регулярно и соответствует соглашениям о преобразовании SQL Server. Точные значения всегда усекаются (никогда не округляются), а переполнение выводит ошибку неподдерживаемого преобразования. Например, вызов метода updateDecimal со значением "1,9999" для базового целочисленного столбца приводит к сохранению в целевом столбце значения "1", но, если будет передано значение "3000000000", драйвер вызовет исключение.

  • Зависимые от данных (z): преобразования из типа строки Java в базовый тип данных SQL Server зависят от следующих условий: драйвер отправляет строковое значение в SQL Server и SQL Server выполняет преобразования при необходимости. Если для sendStringParametersAsUnicode задано значение true, а базовый тип данных SQL Server — образ, SQL Server не разрешает преобразование nvarchar в образ и создает исключение SQLServerException. Если для sendStringParametersAsUnicode задано значение false, а базовый тип данных SQL Server — образ, SQL Server позволяет преобразовать varchar в образ и не создает исключение.

SQL Server выполняет преобразования и передает ошибки обратно в драйвер JDBC при возникновении проблем.

Если тип данных столбца SQL Server является XML, значение данных должно быть допустимым XML. При вызове методов updateBytes, updateBinaryStream или updateBlob значение данных должно быть шестнадцатеричным представлением для строки XML-символов. Пример:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

Обратите внимание, что метка следования байтов (BOM) является обязательной, если XML-символы имеют определенную кодировку.

Преобразование относительно setObject

Примечание.

Microsoft JDBC Driver 4.2 (и выше) для SQL Server поддерживает JDBC 4.1 и 4.2. Дополнительные сведения о сопоставлениях и преобразованиях типов данных 4.1 и 4.2 см. в статьях Соответствие JDBC 4.1 для JDBC Driver и Соответствие JDBC 4.2 для JDBC Driver.

Для данных на языке Java, передаваемых методам setObject(<Type>) класса SQLServerPreparedStatement, применяются следующие виды преобразования.

JDBCSetObjectConversions

Метод setObject с неуказанным целевым типом использует сопоставление по умолчанию. Если это тип данных String и значение превышает длину VARCHAR, то оно сопоставляется с LONGVARCHAR. Аналогичным образом NVARCHAR сопоставляется с LONGNVARCHAR, если значение превышает поддерживаемую длину NVARCHAR. То же относится и к byte[]. Значения, превышающие VARBINARY, становятся LONGVARBINARY.

Преобразования, поддерживаемые методами setObject драйвера JDBC, делятся на три категории.

  • Без потерь (x). Преобразования для числовых случаев, когда тип задания является таким же или меньшим, чем базовый тип сервера. Например, при вызове метода setBigDecimal для базового десятичного столбца сервера преобразование не потребуется. В случае преобразования числовых данных в символьные тип данных Java numeric преобразуется в String. Например, вызов метода setDouble со значением "53" относительно столбца varchar(50) формирует символьное значение "53" в целевом столбце.

  • С преобразованием (y). Преобразования из типа Java numeric в базовый тип сервера numeric, меньший по размеру. Это преобразование регулярно и соответствует соглашениям о преобразовании SQL Server. Точные значения всегда усекаются (никогда не округляются), а переполнение выводит ошибку неподдерживаемого преобразования. Например, вызов метода updateDecimal со значением "1,9999" для базового целочисленного столбца приводит к сохранению в целевом столбце значения "1", но, если будет передано значение "3000000000", драйвер вызовет исключение.

  • Зависимые от данных (z): преобразования из типа строки Java в базовый тип данных SQL Server зависят от следующих условий: драйвер отправляет строковое значение в SQL Server и SQL Server выполняет преобразования при необходимости. Если для свойства подключения sendStringParametersAsUnicode задано значение true, а базовый тип данных SQL Server — образ, SQL Server не разрешает преобразование nvarchar в образ и создает исключение SQLServerException. Если для sendStringParametersAsUnicode задано значение false, а базовый тип данных SQL Server — образ, SQL Server позволяет преобразовать varchar в образ и не создает исключение.

SQL Server выполняет большую часть преобразований набора и передает ошибки обратно в драйвер JDBC при возникновении проблем. Преобразование на стороне клиента является исключением и выполняется только в случае значений date, time, timestamp, Boolean и String.

Если тип данных столбца SQL Server является XML, значение данных должно быть допустимым XML. При вызове методов setObject(byte[], SQLXML), setObject(inputStream, SQLXML) или setObject(Blob, SQLXML) значение данных должно быть шестнадцатеричным представлением для строки XML-символов. Пример:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

Обратите внимание, что метка следования байтов (BOM) является обязательной, если XML-символы имеют определенную кодировку.

См. также

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