首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在mysql中插入空日期值

问不能在mysql中插入空日期值
EN

Stack Overflow用户
提问于 2013-01-25 01:33:01
回答 3查看 3.3K关注 0票数 0
代码语言:javascript
复制
String datum = datumInvoer.getText();

    **String bdate = bdatumInvoer.getText();**

    String[] speler = spelers.getSelectedItem().toString().split(" ");


    String[] toernooi = toernooien.getSelectedItem().toString().split(" ");
    try {
        PreparedStatement query = con.prepareStatement("INSERT INTO `fullhouse`.`inschrijving_toernooi` ( `IT_datum`, `IT_betaaldatum`, `speler`, `toernooi`) VALUES (?, ?, ? ,?)");
        query.setString(1, datum);
        query.setString(2, bdatum);
        query.setString(3, speler[0]);
        query.setString(4, toernooi[0]);

        query.execute();

我已经将缺省值设置为NULL,但它仍然不会插入它。我即将将数据类型更改为varchar。

错误:日期值不正确

分隔符$$

代码语言:javascript
复制
CREATE TABLE `inschrijving_toernooi` (
  `IT_code` int(11) NOT NULL AUTO_INCREMENT,
 `IT_datum` date DEFAULT NULL,
  `IT_betaaldatum` date DEFAULT NULL,
 `speler` int(11) NOT NULL,
 `toernooi` int(11) NOT NULL,
PRIMARY KEY (`IT_code`),
UNIQUE KEY `aaa` (`speler`,`toernooi`),
 KEY `FS_code_idx` (`speler`),
KEY `FT_code_idx` (`toernooi`),
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-25 01:56:13

首先,将日期参数从字符串转换为日期。下面的代码。

代码语言:javascript
复制
String bdate = bdatumInvoer.getText();
// get the correct date Format
// follow the link to get correct date format
// throws ParseException 
Date date = new SimpleDateFormat("dd-MM-yyyy").parse(bdate);

Class SimpleDateFormat API

现在,在准备好的语句中,将它们设置为日期,如下所示。因为您的表结构允许在表中使用日期。

代码语言:javascript
复制
query.setDate(2, date);

现在,您仍然希望将该列设置为null,然后可以在准备好的语句中使用以下格式,并告诉查询设置null。

代码语言:javascript
复制
query.setNull(2, java.sql.Types.DATE);

或

代码语言:javascript
复制
query.setDate(2, null);

setNull API

Mapping of java.sql.Types to SQL types

我想这会解决你的问题。

票数 1
EN

Stack Overflow用户

发布于 2013-01-25 01:52:21

您需要更改将参数传递给预准备语句的方式

它应该类似于下面的内容。并且datum和bdatum的类型应该是Date。如果您没有使用在数据库中定义的类型,则可以将无效数据传递给sql,这将导致异常。

代码语言:javascript
复制
query.setDate(1, datum);
query.setDate(2, bdatum);
query.setInt(3, speler[0]);
query.setInt(4, toernooi[0]);
票数 0
EN

Stack Overflow用户

发布于 2013-01-25 01:53:57

我怀疑您的bdatum变量包含空字符串。如果要插入SQL null,则需要传入null,而不是空字符串。(当我在我的机器上使用类似的insert进行尝试时,我在尝试插入空字符串时得到了一个“不正确的日期值”,但没有使用null。)

代码语言:javascript
复制
if ("".equals(bdatum))
    bdatum = null;

ps.setString(2, bdatum);

当您在JDBC中传入一个字符串作为日期值时,MySQL将尝试解析它,但空字符串("")不是有效值。这与您尝试使用日期文字执行插入操作类似:

代码语言:javascript
复制
INSERT INTO `some_table` (`some_nullable_date_column`) VALUES ('2000-01-01') -- this works
INSERT INTO `some_table` (`some_nullable_date_column`) VALUES (NULL) -- this works
INSERT INTO `some_table` (`some_nullable_date_column`) VALUES ('') -- this fails

另外,传入日期值的字符串在语义上是错误的,而且可能不如在将字符串传递给PreparedStatement之前将其解析到Date对象的健壮性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14507278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档