Skip to main content

MySQL 类型与 Java 类型映射

MySQL Connector/J 对于 MySQL 数据类型和 Java 数据类型之间的转换是很灵活的。 一般来讲,任何 MySQL 数据类型都可以被转换为一个 java.lang.String,任何 MySQL 数字类型都可以被转换为任何一种能 Java 数字类型(当然这也可能出现一些四舍五入,溢出,精度丢失之类的问题)

注意

所有 TEXT 类型返回 Types.LONGVARCHAR 与不同的 getPrecision() 值(分别为 65535、255、16777215 和 2147483647),getColumnType() 返回 -1。即使 TINYTEXT 不属于 LONGVARCHAR 类别中的大小,这种行为也是有意的。这是为了避免在同一基类型内进行不同的处理。并且 getColumnType() 返回 -1 因为内部服务器处理是 TEXT 类型,类似于 BLOB

另请注意,即使 getColumnType() 返回 Types.LONGVARCHAR,getColumnTypeName() 也将返回 VARCHAR,因为 VARCHAR 是此类型的指定列数据库特定名称。

Connector/J 发出警告或引发 JDBC 规范要求的 DataTruncation 异常,除非使用属性 jdbcCompliantTruncation 将连接配置不为这样做,否则将其设置为 false。

下表列出了始终保证可以正常工作的转换。第一列列出了一个或多个 MySQL 数据类型,第二列列出了一个或多个可以将 MySQL 类型转换为 Java 类型

转换表#

MySQL 数据类型可被转换成 Java 类型
CHAR, VARCHAR, BLOB, TEXT, ENUM, and SETjava.lang.String, java.io.InputStream, java.io.Reader, java.sql.Blob, java.sql.Clob
FLOAT, REAL, DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINTjava.lang.String, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Double, java.math.BigDecimal
DATE, TIME, DATETIME, TIMESTAMPjava.lang.String, java.sql.Date, java.sql.Timestamp
注意

如果您选择的 Java 数字数据类型的精度或容量低于要转换 from/to 的 MySQL 数据类型,则可能会发生舍入、溢出或精度损失

对照表#

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

MySQL 类型名GetColumnTypeName返回值返回的 Java 类
BIT(1)BITjava.lang.Boolean
BIT( > 1)BITbyte[]
TINYINTTINYINT如果 tinyInt1isBit 配置设置为 true(默认为 true),是 java.lang.Boolean,存储空间 为 1;否则是为 java.lang.Integer
BOOL, BOOLEANTINYINT参见 TINYINT。这些是 TINYINT(1) 另一种写法而已
SMALLINT[(M)][UNSIGNED]SMALLINT [UNSIGNED]java.lang.Integer(不管是否无符)
MEDIUMINT[(M)][UNSIGNED]MEDIUMINT [UNSIGNED]java.lang.Integer;无符的话是 java.lang.Long(C/J 3.1 或更早),或者 java.lang.Integer(C/J 5.0 或更晚)
INT,INTEGER[(M)][UNSIGNED]INTEGER [UNSIGNED]java.lang.Integer;无符的话是 java.lang.Long
BIGINT[(M)][UNSIGNED]BIGINT [UNSIGNED]java.lang.Long;无符的话是 java.math.BigInteger
FLOAT[(M,D)]FLOATjava.lang.Float
DOUBLE[(M,B)]DOUBLEjava.lang.Double
DECIMAL[(M[,D])]DECIMALjava.math.BigDecimal
DATEDATEjava.sql.Date
DATETIMEDATETIMEjava.sql.Timestamp
TIMESTAMP[(M)]TIMESTAMPjava.sql.Timestamp
TIMETIMEjava.sql.Time
YEAR[(24)]YEAR
CHAR(M)CHARjava.lang.String(除非该列字符集设置为 BINARY,那样返回 byte[])
VARCHAR(M) [BINARY]VARCHARjava.lang.String(除非该列字符集设置为 BINARY,那样返回 byte[])
BINARY(M)BINARYbyte[]
VARBINARY(M)VARBINARYbyte[]
TINYBLOBTINYBLOBbyte[]
TINYTEXTVARCHARjava.lang.String
BLOBBLOBbyte[]
TEXTVARCHARjava.lang.String
MEDIUMBLOBMEDIUMBLOBbyte[]
MEDIUMTEXTVARCHARjava.lang.String
LONGBLOBLONGBLOBbyte[]
LONGTEXTVARCHARjava.lang.String
ENUM('value1','value2',...)CHARjava.lang.String
ET('value1','value2',...)CHARjava.lang.String

Java, JDBC, and MySQL Types