garbagetown

個人の日記です

zeroDateTimeBehavior

MySQL で Date 型や Timestamp 型の列を定義している場合、この列の値が null の時に jdbc でアクセスすると SQLException が飛んできます。

java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 11 to TIMESTAMP.
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
	com.mysql.jdbc.ResultSetRow.getTimestampFast(ResultSetRow.java:1336)
	com.mysql.jdbc.ByteArrayRow.getTimestampFast(ByteArrayRow.java:126)
	com.mysql.jdbc.ResultSetImpl.getTimestampInternal(ResultSetImpl.java:6687)
	com.mysql.jdbc.ResultSetImpl.getTimestamp(ResultSetImpl.java:6006)

MySQL 用の jdbc ドライバ Connector/J 3.1 以降の仕様だそうで、これを回避するには url の末尾に zeroDateTimeBehavior=convertToNull を付けてやれば良いそうです。

<component name="xaDataSource"
    class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
    <property name="driverClassName">
        "com.mysql.jdbc.Driver"
    </property>
    <property name="URL">
        "jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull"
    </property>
    <property name="user">"test"</property>
    <property name="password">"test"</property>
</component>

100% 忘れる自信があるので自分用にメモっておきます。よう俺、役に立ったか?