3.5.5 Java、JDBC 和 MySQL 类型

MySQL Connector/J 在处理 MySQL 数据类型和 Java 数据类型之间的转换方面非常灵活。

通常,任何 MySQL 数据类型都可以转换为 java.lang.String,任何数字类型都可以转换为任何 Java 数字类型,尽管可能会出现舍入、溢出或精度损失。

Connector/J 按照 JDBC 规范的要求发出警告或抛出 DataTruncation异常,除非通过使用属性将连接配置为不这样做 jdbcCompliantTruncation并将其设置为 false.

下表列出了始终保证有效的转换。第一列列出了一种或多种 MySQL 数据类型,第二列列出了一种或多种 MySQL 类型可以转换为的 Java 类型。

表 3.22 MySQL 和 Java 数据类型之间可能的转换

这些 MySQL 数据类型 总是可以转换为这些 Java 类型
CHAR, VARCHAR, BLOB, TEXT, ENUM, and SET java.lang.String, java.io.InputStream, java.io.Reader, java.sql.Blob, java.sql.Clob
FLOAT, REAL, DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINT java.lang.String, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Double, java.math.BigDecimal
DATE, TIME, DATETIME, TIMESTAMP java.lang.String, java.sql.Date, java.sql.Timestamp

笔记

如果您选择的 Java 数字数据类型的精度或容量低于您正在转换的 MySQL 数据类型,则可能会发生舍入、溢出或精度丢失。

ResultSet.getObject()方法使用 MySQL 和 Java 类型之间的类型转换,并在适当的地方遵循 JDBC 规范。ResultSetMetaData.GetColumnTypeName()和 返回的值 ResultSetMetaData.GetColumnClassName() 如下表所示。有关 JDBC 类型的更多信息,请参阅有关 java.sql.Types 类的参考资料。

表 3.23 ResultSetMetaData.GetColumnTypeName() 和 ResultSetMetaData.GetColumnClassName() 的 MySQL 类型和返回值

MySQL 类型名称的返回值GetColumnTypeName的返回值GetColumnClassName
BIT(1)BITjava.lang.Boolean
BIT( > 1)BITbyte[]
TINYINT(1) SIGNED, BOOLEAN

如果tinyInt1isBit=truetransformedBitIsBoolean=falseBIT

如果tinyInt1isBit=truetransformedBitIsBoolean=true: BOOLEAN

如果tinyInt1isBit=falseTINYINT

如果tinyInt1isBit=truetransformedBitIsBoolean=false java.lang.Boolean

如果tinyInt1isBit=truetransformedBitIsBoolean=true java.lang.Boolean

如果tinyInt1isBit=falsejava.lang.Integer

TINYINT( > 1) SIGNEDTINYINTjava.lang.Integer
TINYINT( any ) UNSIGNEDTINYINT UNSIGNEDjava.lang.Integer
SMALLINT[(M)] [UNSIGNED]SMALLINT [UNSIGNED]java.lang.Integer(不管有 UNSIGNED没有)
MEDIUMINT[(M)] [UNSIGNED]MEDIUMINT [UNSIGNED]java.lang.Integer(不管有 UNSIGNED没有)
INT,INTEGER[(M)]INTEGERjava.lang.Integer
INT,INTEGER[(M)] UNSIGNEDINTEGER UNSIGNEDjava.lang.Long
BIGINT[(M)]BIGINT java.lang.Long
BIGINT[(M)] UNSIGNEDBIGINT UNSIGNEDjava.math.BigInteger
FLOAT[(M,D)]FLOATjava.lang.Float
DOUBLE[(M,B)] [UNSIGNED]DOUBLEjava.lang.Double(不管有 UNSIGNED没有)
DECIMAL[(M[,D])] [UNSIGNED]DECIMALjava.math.BigDecimal(不管有 UNSIGNED没有)
DATEDATEjava.sql.Date
DATETIMEDATETIMEjava.time.LocalDateTime
TIMESTAMP[(M)]TIMESTAMPjava.sql.Timestamp
TIMETIMEjava.sql.Time
YEAR[(2|4)]YEAR如果 yearIsDateType 配置属性设置为 false,则返回的对象类型为java.sql.Short。如果设置为 true(默认值),则返回的对象的类型为java.sql.Date
CHAR(M)CHARjava.lang.String
VARCHAR(M)VARCHARjava.lang.String
BINARY(M),CHAR(M) BINARYBINARYbyte[]
VARBINARY(M),VARCHAR(M) BINARYVARBINARYbyte[]
BLOBBLOBbyte[]
TINYBLOBTINYBLOBbyte[]
MEDIUMBLOBMEDIUMBLOBbyte[]
LONGBLOBLONGBLOBbyte[]
TEXTTEXTjava.lang.String
TINYTEXTTINYTEXTjava.lang.String
MEDIUMTEXTMEDIUMTEXTjava.lang.String
LONGTEXTLONGTEXTjava.lang.String
JSONJSONjava.lang.String
GEOMETRYGEOMETRYbyte[]
ENUM('value1','value2',...)CHARjava.lang.String
SET('value1','value2',...)CHARjava.lang.String