2016-05-31 4 views
0

次のように、 'キャスト'を& charで使用すると、 のbigintと同じコマンドが実行されますが、それぞれ同じvarcharのコマンドは使用できません。bigintとvarcharを使用したmysqlの 'キャスト'の問題

これはmysqlの既知の問題ですか? jooqを使用しているときに私はこの問題に遭遇しました。

これに対応する方法がある場合は、mysqlまたはjooqでそれが最適です。 ありがとう!

バージョンSQLが コマンド

$ mysql --version 
mysql Ver 15.1 Distrib 5.5.39-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1 

これら二つの作業罰金

MariaDB [puresw]> select cast(100 as int); 
+------------------+ 
| cast(100 as int) | 
+------------------+ 
|    100 | 
+------------------+ 
1 row in set (0.01 sec) 

MariaDB [puresw]> select cast('abc' as char(32)); 
+-------------------------+ 
| cast('abc' as char(32)) | 
+-------------------------+ 
| abc      | 
+-------------------------+ 
1 row in set (0.00 sec) 

これら二つは、SQLクエリによって引き起こさ

MariaDB [puresw]> select cast(100 as bigint); 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'bigint)' at line 1 

MariaDB [puresw]> select cast('abc' as varchar(32)); 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'varchar(32))' at line 1 

問題が

をjooqによって生成されません
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'bigint), cast(0 as int), cast('ABC' as varchar), cast('Purity' as varchar), cast' at line 1 
Query is: 
sql : 'insert into software_version (task_id, controller, group_id, name, version, status) values (cast(? as bigint), cast(? as int), cast(? as varchar), cast(? as varchar), cast(? as varchar), cast(? as varchar))', parameters : [100,0,'ABC','Purity','4.5.2','Available'] 
    at org.mariadb.jdbc.internal.SQLExceptionMapper.get(SQLExceptionMapper.java:138) ~[mariadb-java-client-1.1.9.jar:?] 
    at org.mariadb.jdbc.internal.SQLExceptionMapper.throwException(SQLExceptionMapper.java:106) ~[mariadb-java-client-1.1.9.jar:?] 
    at org.mariadb.jdbc.MySQLStatement.executeQueryEpilog(MySQLStatement.java:268) ~[mariadb-java-client-1.1.9.jar:?] 
    at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:296) ~[mariadb-java-client-1.1.9.jar:?] 
    at org.mariadb.jdbc.MySQLStatement.executeUpdate(MySQLStatement.java:364) ~[mariadb-java-client-1.1.9.jar:?] 
    at org.mariadb.jdbc.MySQLPreparedStatement.executeUpdate(MySQLPreparedStatement.java:148) ~[mariadb-java-client-1.1.9.jar:?] 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) ~[commons-dbcp-1.4.jar:1.4] 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) ~[commons-dbcp-1.4.jar:1.4] 
    at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:916) ~[spring-jdbc-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
    at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:909) ~[spring-jdbc-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644) ~[spring-jdbc-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
    ... 43 more 
+0

キャストは、すべてのタイプをサポートしていませんhttp://dev.mysql.com/doc/refman/5.7/en/cast-functions.html #function_convert 私の経験では、多くの場合、 "int"へのキャストは "bigint"にキャストされています(ODBCの結果による)。 – Uueerdo

+0

あなたのjOOQクエリはどのように構築されましたか?あなたは適切な 'SQLDialect'を使用していますか?すべてが適切に設定されていれば、jOOQはMySQLとMariaDBのためにこの権利を取得します... –

+0

あなたの応答に感謝します。以下の私の回答を確認してください。 mysqlが壊れているようには見えません - バグのようです。 –

答えて

0

ユーザーエラーでした。私は、H2データベースのSQLダイアレクト用に設定されたjooqコンテキストを使用していました。 mysqlで使用する別のjooqコンテキストを作成し、問題は解決しました。これはDAOのxmlファイル内jooqセクションは今のように見えるものです:

<bean id="jooqSettings" class="org.jooq.conf.Settings"> 
    <property name="renderNameStyle" value="AS_IS"/> 
</bean> 

<bean id="jooqConfig" class="org.jooq.impl.DefaultConfiguration"> 
    <property name="SQLDialect" value="H2"/> 
    <property name="settings" ref="jooqSettings"/> 
</bean> 

<bean id="jooqContext" class="org.jooq.impl.DefaultDSLContext"> 
    <constructor-arg ref="jooqConfig"/> 
</bean> 

<bean id="jooqConfigMysql" class="org.jooq.impl.DefaultConfiguration"> 
    <property name="SQLDialect" value="MYSQL"/> 
    <property name="settings" ref="jooqSettings"/> 
</bean> 

<bean id="jooqContextMysql" class="org.jooq.impl.DefaultDSLContext"> 
    <constructor-arg ref="jooqConfigMysql"/> 
</bean> 
関連する問題