mysql - mysql 中使用 bigint 和 varchar 时出现“cast”问题

标签 mysql casting

如下所示,将“cast”与 int 和 char 一起使用效果很好, 但与 bigint 和 varchar 相同的命令分别不会。

这是 mysql 中的已知问题吗? 我在使用 jooq 时遇到了这个问题 - 下面有更多详细信息。

如果在 mysql 或 jooq 中有解决方法,那就太好了。 谢谢!

版本

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

SQL命令 这两个工作正常

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)

这两个没有

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生成的SQL查询导致的问题

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

最佳答案

这是用户错误。我使用的是为 H2 数据库的 SQL 方言配置的 jooq 上下文。创建了另一个 jooq 上下文来与 mysql 一起使用,问题就消失了。这就是 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>

关于mysql - mysql 中使用 bigint 和 varchar 时出现“cast”问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37552206/

相关文章:

php - MySQL 查询警告

mysql - 上传到服务器后,输出json的所有数字都是字符串

Java:将对象转换为泛型

javascript - 为什么 true 不匹配 'true' 与 JavaScript 中的双等号 '=='?

c# - 我可以在 C# 中使用 "class"类型吗?

c# - 在 C# 中转换为泛型类型

php - 使用 php mysqli 或 pdo 更新数据库中的年龄列

php - 如何保护本地托管网站的源代码?

MySQL 存储过程 - 无法重新打开表(不是临时表)

c# - 为什么我必须将枚举参数重新转换为其声明的类型?