MySQL Connector/J在处理MySQL数据类型和Java数据类型的转换处理方面十分灵活。
尽管可能会出现舍入、溢出或精度损失,当在通常情况下,能够将任何MySQL数据类型转换为java.lang.String,并能将任何数值类型转换为Java数值类型。
从Connector/J 3.1.0开始,按照JDBC规范的要求,JDBC驱动程序将发出警告或抛出DataTruncation异常,除非通过使用“jdbcCompliantTruncation”属性并将其设为“假”,对连接进行相应配置取消了前述要求。
在下面的表格中,列出能可靠工作的转换:
转换表
下述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
注释:
与希望转换的MySQL数据类型相比,如果选择了精度较低的Java数值类型,可能会出现舍入、溢出或精度损失。
DATE, TIME, DATETIME, TIMESTAMP
java.lang.String, java.sql.Date, java.sql.Timestamp
在MySQL类型和Java类型之间,ResultSet.getObject()方法采用了下述类型转换方式,在可能的情况下遵从JDBC规范:
用于ResultSet.getObject()的MySQL类型和Java类型
MySQL类型名称
以Java类返回
BIT(1)(new in MySQL-5.0)
java.lang.Boolean
BIT( > 1)(new in MySQL-5.0)
byte[]
TINYINT
java.lang.Boolean,如果将配置属性“tinyInt1isBit”设为“真”(默认值),并将存储大小设为“1”;或java.lang.Integer,如果不是的话。
BOOL , BOOLEAN
请参见上面的TINYINT,它们目前是TINYINT(1)的别名。
SMALLINT[(M)] [UNSIGNED]
java.lang.Integer(无论是否为UNSIGNED)
MEDIUMINT[(M)] [UNSIGNED]
java.lang.Integer(无论是否为UNSIGNED)
INT,INTEGER[(M)] [UNSIGNED]
java.lang.Integer,如果是UNSIGNED,java.lang.Long
BIGINT[(M)] [UNSIGNED]
java.lang.Long,如果是UNSIGNED,java.math.BigInteger
FLOAT[(M,D)]
java.lang.Float
DOUBLE[(M,B)]
java.lang.Double
DECIMAL[(M[,D])]
java.math.BigDecimal
DATE
java.sql.Date
DATETIME
java.sql.Timestamp
TIMESTAMP[(M)]
java.sql.Timestamp
TIME
java.sql.Time
YEAR[(2|4)]
java.sql.Date(日期设为2月1日晚上2点)
CHAR(M)
java.lang.String(除非列的字符集是BINARY),然后返回字节[]
VARCHAR(M) [BINARY]
java.lang.String(除非列的字符集是BINARY),然后返回字节[]
BINARY(M)
byte[]
VARBINARY(M)
byte[]
TINYBLOB
byte[]
TINYTEXT
java.lang.String
BLOB
byte[]
TEXT
java.lang.String
MEDIUMBLOB
byte[]
MEDIUMTEXT
java.lang.String
LONGBLOB
byte[]
LONGTEXT
java.lang.String
ENUM('value1','value2',...)
java.lang.String
SET('value1','value2',...)
java.lang.String
使用字符集和Unicode
对于从JDBC驱动程序发往服务器的所有字符串,均将自动地从固有放热Java Unicode形式转换为客户端字符编码,包括通过Statement.execute()、Statement.executeUpdate()和Statement.executeQuery()发出的所有查询,以及除了用setBytes()、setBinaryStream()、setAsiiStream()、setUnicodeStream()和setBlob()排除的参试之外的所有PreparedStatement和CallableStatement参数。
在MySQL服务器4.1之前,Connector/J支持每连接单一字符编码,能够从服务器配置自动检测到它,也能由用户通过使用useUnicode和characterEncoding属性配置它。
从MySQL服务器4.1版起,Connector/J支持客户端和服务器之间的但以字符编码,以及针对结果集中从服务器返回至客户端的数据的任意数目字符编码。
连接时将自动检测客户端和服务器之间的字符编码。对于由驱动程序使用的编码来说,它是在服务器上通过使用配置变量“character_set”(低于4.1.0的服务器版本)和“character_set_server”(4.1.0和更高的服务器版本)指定的。更多信息,请参见MySQL服务器手册中的
要想覆盖客户端上的自动检测编码功能,可在用于连接到服务器的URL中使用“characterEncoding”属性。
在客户端上指定字符编码时,应使用Java风格名称。在下面的表格中,列出了用于MySQL字符集的Java风格名称:
MySQL对Java编码名称的翻译
MySQL字符集名称
Java风格字符编码名称
usa7
US-ASCII
big5
Big5
gbk
GBK
sjis
SJIS
gb2312
EUC_CN
ujis
EUC_JP
euc_kr
EUC_KR
latin1
ISO8859_1
latin1_de
ISO8859_1
german1
ISO8859_1
danish
ISO8859_1
latin2
ISO8859_2
czech
ISO8859_2
hungarian
ISO8859_2
croat
ISO8859_2
greek
ISO8859_7
hebrew
ISO8859_8
latin5
ISO8859_9
latvian
ISO8859_13
latvian1
ISO8859_13
estonia
ISO8859_13
dos
Cp437
pclatin2
Cp852
cp866
Cp866
koi8_ru
KOI8_R
tis620
TIS620
win1250
Cp1250
win1250ch
Cp1250
win1251
Cp1251
cp1251
Cp1251
win1251ukr
Cp1251
cp1257
Cp1257
macroman
MacRoman
macce
MacCentralEurope
utf8
UTF-8
ucs2
UnicodeBig
警告
不要用Connector/J发出查询“set names”,这是因为驱动程序不会检测已变化的字符集,而是会继续使用在初始连接设置中检测到的字符集。
为了允许从客户端发出的多个字符集,应使用“UTF-8”编码,方式是,将utf8配置为默认的服务器字符集,或通过“characterEncoding”属性配置JDBC驱动程序以使用“UTF-8”。