gpt4 book ai didi

Java MySQLPreparedStatement.setBoolean 将值括在引号中

转载 作者:行者123 更新时间:2023-11-30 01:13:19 28 4
gpt4 key购买 nike

我的问题的简短版本是:

PreparedStatement ps;
ps = connection.prepareStatement("Insert into T values (?)");
ps.setBoolean(1, true);
ps.executeUpdate();

此代码示例生成值用引号括起来的查询的原因是什么?

我的问题的长版本是:

我有一个带有普通 JDBC 的 JavaEE 应用程序用于数据库交互,最近我注意到我的日志中出现了一些 MySQLDataTruncation 异常。这些异常是在尝试将实体保存到数据库表中时发生的,该表的 boolean 列定义为 BIT(1)。这是因为生成的查询如下所示:

Insert into T values ('1');

请注意,值用引号引起来。使用 Log4J log.info(ps); 语句从应用程序记录查询。以前的日志表明没有引号。

此外,甚至 MySQL 服务器日志也开始看起来不同。在此发生之前,我为每个执行的查询提供了成对的记录:

12345 Prepare Insert into T values (?)
12345 Execute Insert into T values (1)

之后:

12345 Query Insert into T values ('1')

值得注意的是,这些更改不是部署新版本应用程序的结果,甚至不是重新启动 MySQL/应用程序服务器和负责查询生成的代码的结果,就像本问题中的示例一样简单。

应用程序服务器重新启动解决了该问题大约 12 小时,然后又发生了。作为临时解决方案,我将 BIT 列更改为 TINYINT

附注通过检查应用程序日志和MySQL日志,可以将出现问题的时间范围缩小到2分钟左右,但在此期间日志中没有任何异常。

P.P.S。应用服务器为Glassfish 2.1.1,MySQL服务器版本为5.5.31-1~dotdeb,MySQL Connector/J版本为5.0.3。

最佳答案

事实证明,这实际上是未封闭的准备好的语句的问题。当 MySQL 服务器上打开的语句计数达到允许的最大值时,应用程序仍然能够以某种方式继续工作,而不会产生 sql 错误:

Error Code: 1461 Can’t create more than max_prepared_stmt_count statements

但是在这种模式中,它开始用引号将 boolean 值括起来,导致我所有的麻烦都影响到 BIT(1) 列。

关于Java MySQLPreparedStatement.setBoolean 将值括在引号中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19290459/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com