【问题标题】:query runs fine in mysql and php but not in java查询在 mysql 和 php 中运行良好,但在 java 中没有
【发布时间】:2012-05-31 23:08:04
【问题描述】:

我在 PHP 中有以下 mysql 查询,它工作正常。

$strUpdate = "INSERT INTO  `batchfolder`.`newbatch` (`BatchID` ,`Batch` ,`barcode` ,`PG`)VALUES (NULL ,  '',  '1',  '')";

当我直接在数据库中运行它时也很好。

但是当我在java中运行它时,

 try {
          conn = DriverManager.getConnection (url, userName, password);
          Statement st = conn.createStatement();
          st.execute("INSERT INTO  `batchfolder`.`newbatch` (`BatchID` ,`Batch` ,`barcode` ,`PG`)VALUES (NULL ,  '',  '1',  '')");            
          st.close();
}

它给出了以下错误。

Exception in thread "main" java.sql.SQLException: Field 'Pre' doesn't have a default value

Pre 是数据库中的下一行,它没有默认值。

我的问题是,那么这个查询如何在 mysql 和 php 中运行良好。

P.S BatchID 是 newbatch 中的 int(10) autoincremented 值。

这是我的表结构。

CREATE TABLE IF NOT EXISTS `newbatch` (
  `BatchID` int(10) NOT NULL AUTO_INCREMENT,
  `Batch` varchar(100) NOT NULL,
  `barcode` varchar(5) NOT NULL,
  `Ly` varchar(5) NOT NULL DEFAULT '0',
  `PG` varchar(5) NOT NULL,
  `Pre` varchar(5) NOT NULL,
  `Flu` varchar(5) NOT NULL,
  `FluID` varchar(100) DEFAULT NULL,
  `DateCreated` varchar(100) DEFAULT NULL,
  `Comments` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`BatchID`),
  UNIQUE KEY `FluID` (`FluID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1000160 ;

【问题讨论】:

  • 你能展示一下表格的结构吗?
  • show create table newbatch 会有所帮助。
  • 我感觉你刚刚学习Java,考虑使用prepared statement。
  • @BenSchro10 是的,我是 Java 新手。我以前用过,但直到最近才用得太多。我也知道准备好的声明。但我想它会抛出同样的错误..
  • 我刚刚尝试在使用您的CREATE 语句创建表格后在 phpMyAdmin 中执行您的查询 - 它没有工作(您遇到相同的错误)。我认为必须进行其他操作才能使其在 PHP 中运行。

标签: java php mysql


【解决方案1】:

您确定这确实在 PHP 中运行吗?您可能只是没有看到错误消息。

使用display_errors = 'on'error_reporting(E_ALL | E_STRICT); 再试一次 这是一个 SQL 错误,它不依赖于驱动程序。驱动程序只是向您显示消息。

更新: 看起来 Java 出于某种原因关闭了 MySQL 的严格模式。 (据我所知)唯一应该能够导致这种行为的是 MySQL 严格模式被关闭。

如果未启用严格模式,MySQL 将列设置为隐式 列数据类型的默认值。

您可以通过SELECT @@GLOBAL.sql_mode;查看您的服务器运行的模式。在 Java 和 PHP 中尝试一下。如果结果不同,那就是您的答案。

UPDATE2: Jep!

【讨论】:

  • 在数据库中也运行良好
  • 两次都是同一个 MySQL 服务器吗?
  • 我试着按照你的建议去做。 php 和 java 都没有产生任何东西。
  • 可能不是全局的,而是会话模式。 SELECT @@SESSION.sql_mode;
  • 我认为这个答案是正确的。您安装的 MySQL 必须禁用严格模式,但 Java 与 PHP 和 MySQL 不同,强制使用严格模式。检查您的 my.ini 文件。
【解决方案2】:

查看您的表定义,您已将 Pre 定义为 not null,但您没有在插入时为其指定值,因此它应该正确显示错误。

【讨论】:

  • 我知道应该。它不在 PHP 和数据库中
  • 我很好奇,如果您已将列定义为 NOT NULL,并且您的插入语句未指定值,那么 PHP 作为值放入的到底是什么?
  • 感谢@Cypher,我认为即使使用那个mysql选项SQL语句本身仍然无效,所以我猜测它可能是驱动程序问题,只需重写查询使其正确,就是这样最终是正确的做法,因为我们已经完成了桌面设计。
  • @BenSchro10 我和你在一起。我重写了查询,一切都很好。我很好奇为什么我的错误查询一直在工作而没有抛出错误。第一次,我对某些东西起作用(当它不应该起作用时)感到不高兴。
【解决方案3】:

您有几个“NOT NULL”的数据库字段,因此您必须在 INSERT 语句中指定这些字段。我也无法想象这在 PHP 中是如何工作的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2012-01-12
  • 2020-02-25
  • 1970-01-01
  • 2014-12-25
相关资源
最近更新 更多