了解数据类型转换

为了简化 Java 编程语言数据类型到 SQL Server 数据类型的转换，Microsoft JDBC Driver for SQL Server 根据 JDBC 规范的要求提供了数据类型转换。为了提高灵活性，所有类型都可以与 Object、String 和 byte[] 数据类型相互转换。

# Getter 方法转换

基于 SQL Server 的数据类型，以下图表包含 SQLServerResultSet 类的 get<Type>() 方法的 JDBC Driver 转换图，以及 SQLServerCallableStatement 类的 get<Type> 方法支持的转换。

JDBC Driver 的 getter 方法支持三类转换：

- 非丢失 (x)：适用于 getter 类型与基础服务器类型相同或者小于基础服务器类型时的转换。例如，对基础服务器十进制数列调用 getBigDecimal 时，无需进行转换。

- 已转换 (y)：从数值服务器类型转换为 Java 语言类型，其中转换是常规的并遵循 Java 语言转换规则。对于这些转换，总是直接截取有效位数（从不四舍五入），而溢出则按目标类型取模处理，以较小者为准。例如，对于包含“1.9999”的基础 decimal 列调用 getInt 时将返回“1”，或者，如果基础 decimal 值为“3000000000”，则 int 值溢出为“-1294967296”。

- 依赖于数据 (z)：如果从基础字符类型转换到数值类型，则要求字符类型包含可转换为数值类型的值。不执行其他转换。如果值对于 getter 类型过大，则该值无效。例如，如果对包含“53”的 varchar(50) 列调用 getInt，则值将作为 int 返回；如果基础值为“xyz”或“3000000000”，则将引发错误。

如果对 binary、varbinary、varbinary(max) 或 image 列数据类型调用 getString，则值将作为十六进制字符串值返回。

# Updater 方法转换

对于传递给 SQLServerResultSet 类的 update<Type>() 方法的 Java 类型的数据，可应用下列转换。

JDBC Driver 的 updater 方法支持三类转换：

- 非丢失 (x)：适用于 updater 类型与基础服务器类型相同或者小于基础服务器类型时的转换。例如，对基础服务器十进制数列调用 updateBigDecimal 时，无需进行转换。

- 已转换 (y)：从数值服务器类型转换为 Java 语言类型，其中转换是常规的并遵循 Java 语言转换规则。对于这些转换，总是直接截取有效位数（从不四舍五入），而溢出则按目标（较小者）类型取模处理。例如，对包含“1.9999”的基础 int 列调用 updateDecimal 时将返回“1”，如果基础 decimal 值为“3000000000”，则 int 值溢出为“-1294967296”。

- 依赖于数据 (z)：如果从基础源数据类型转换到目标数据类型，则要求源数据类型包含可转换为目标数据类型的值。不执行其他转换。如果值对于 getter 类型过大，则该值无效。例如，如果对包含“53”的 int 列调用 updateString，更新将成功；如果基础字符串值为“foo”或“3000000000”，将引发错误。

对 binary、varbinary、varbinary(max) 或 image 列数据类型调用 updateString 时，会将字符串值作为十六进制字符串值进行处理。

当 SQL Server 列的数据类型为 XML 时，数据值必须是有效的 XML。调用 updateBytes、updateBinaryStream 或 updateBlob 方法时，数据值应为 XML 字符的十六进制字符串表示形式。例如：

    <hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

请注意，如果 XML 字符使用特殊的字符编码，则需要字节顺序标记 (BOM)。

# Setter 方法转换

对于传递给 SQLServerPreparedStatement 类和 SQLServerCallableStatement 类的 set<Type>() 方法的 Java 类型的数据，可应用下列转换。

服务器会尝试所有转换，并在失败时返回错误。

对于 String 数据类型，如果值超过了 VARCHAR 的长度，则将映射为 LONGVARCHAR。同样，对于 NVARCHAR 数据类型，如果值超过了 NVARCHAR 的支持长度，则将映射为 LONGNVARCHAR。这同样适用于 byte[]。比 VARBINARY 长的值将成为 LONGVARBINARY。

JDBC Driver 的 setter 方法支持两类转换：

- 非丢失 (x)：适用于 setter 类型与基础服务器类型相同或者小于基础服务器类型时的数值转换。例如，当对基础服务器 decimal 列调用 setBigDecimal 时，不需要进行转换。对于数值转换为字符的情形，Java numeric 数据类型转换为 String。例如，使用值“53”对 varchar(50) 列调用 setDouble 时将在该目标列中生成字符值“53”。

- 已转换 (y)：从 Java numeric 类型转换为更小的基础服务器 numeric 类型。该转换为常规转换，并且遵循 SQL Server 转换约定。总是直接截取有效位数（从不四舍五入），而溢出将引发“不支持的转换”错误。例如，通过值“1.9999”对基础整数列使用 updateDecimal 时，将在目标列中生成“1”；但如果传递的值为“3000000000”，驱动程序将引发错误。

- 依赖于数据 (z)：从 Java String 类型转换到基础 SQL Server 数据类型取决于以下条件：如有必要，驱动程序会将 String 值发送给 SQL Server，SQL Server 再执行转换。如果 sendStringParametersAsUnicode 设置为 True，并且基础 SQL Server 数据类型为 image，则 SQL Server 将不允许将 nvarchar 转换为 image，并会引发 SQLServerException。如果 sendStringParametersAsUnicode 设置为 False，并且基础 SQL Server 数据类型为 image，则 SQL Server 将允许将 varchar 转换为 image，而不会引发异常。

SQL Server 执行转换，并在出现问题时将错误传回 JDBC 驱动程序。

当 SQL Server 列的数据类型为 XML 时，数据值必须是有效的 XML。调用 updateBytes、updateBinaryStream 或 updateBlob 方法时，数据值应为 XML 字符的十六进制字符串表示形式。例如：

    <hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

请注意，如果 XML 字符使用特殊的字符编码，则需要字节顺序标记 (BOM)。

# setObject 的转换

对于传递给 SQLServerPreparedStatement 类的 setObject(<Type>) 方法的 Java 类型的数据，可应用下列转换。

没有指定目标类型的 setObject 方法将使用默认映射。对于 String 数据类型，如果值超过了 VARCHAR 的长度，则将映射为 LONGVARCHAR。同样，对于 NVARCHAR 数据类型，如果值超过了 NVARCHAR 的支持长度，则将映射为 LONGNVARCHAR。这同样适用于 byte[]。比 VARBINARY 长的值将成为 LONGVARBINARY。

JDBC Driver 的 setObject 方法支持三类转换：

- 非丢失 (x)：适用于 setter 类型与基础服务器类型相同或者小于基础服务器类型时的数值转换。例如，当对基础服务器 decimal 列调用 setBigDecimal 时，不需要进行转换。对于数值转换为字符的情形，Java numeric 数据类型转换为 String。例如，使用值“53”对 varchar(50) 列调用 setDouble 时将在该目标列中生成字符值“53”。

- 已转换 (y)：从 Java numeric 类型转换为更小的基础服务器 numeric 类型。该转换为常规转换，并且遵循 SQL Server 转换约定。总是直接截取有效位数（从不四舍五入），而溢出将引发不支持转换的错误。例如，通过值“1.9999”对基础整数列使用 updateDecimal 时，将在目标列中生成“1”；但如果传递的值为“3000000000”，驱动程序将引发错误。

- 依赖于数据 (z)：从 Java String 类型转换到基础 SQL Server 数据类型取决于以下条件：如有必要，驱动程序会将 String 值发送给 SQL Server，SQL Server 再执行转换。如果 sendStringParametersAsUnicode 连接属性设置为 True，并且基础 SQL Server 数据类型为 image，则 SQL Server 将不允许将 nvarchar 转换为 image，并会引发 SQLServerException。如果 sendStringParametersAsUnicode 设置为 False，并且基础 SQL Server 数据类型为 image，则 SQL Server 将允许将 varchar 转换为 image，而不会引发异常。

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

请注意，如果 XML 字符使用特殊的字符编码，则需要字节顺序标记 (BOM)。

# 请参阅

了解 JDBC 驱动程序数据类型
发送有关本主题的反馈至 Microsoft。

© 2012 Microsoft。保留所有权利。