【问题标题】:Data truncation error (data too long for column item_code)数据截断错误(列 item_code 的数据太长)
【发布时间】:2017-01-03 17:44:36
【问题描述】:

当我更新时,我得到了

数据截断错误(数据对于列 item_codeat row # 而言太长)

我在 DB 中将varchar(45) 用于itemcode

String category="";

String item_code = txt_inventory_item_code.getText();

String item_name = txt_inventory_item_name.getText();

Format formatter = new SimpleDateFormat("yyyy-MM-dd");
String date = formatter.format(txt_inventory_date.getDate());

String expiry_date = formatter.format(txt_inventory_expiry_date.getDate());

int quantity=Integer.parseInt(txt_inventory_quantity.getText());

double unit_price=Double.parseDouble(txt_inventory_unit_price.getText());


try{
    st = conn.createStatement();
    String SQL = "Update inventory SET "
            + "item_code='"+txt_inventory_item_code+"',"
            + "item_name='"+txt_inventory_item_name+"',"
            + "date='"+formatter.format(txt_inventory_date.getDate())+"',"
            + "expiry_date='"+formatter.format(txt_inventory_expiry_date.getDate())+"',"
            + "quantity='"+txt_inventory_quantity+"',"
            + "unit_price='"+txt_inventory_unit_price+"' WHERE inventory_id Like "+txt_inventory_inventory_id.getText();
    st.executeUpdate(SQL);

    JOptionPane.showMessageDialog(null,"Updated Successfully");

}
catch (SQLException | HeadlessException e)
{
    JOptionPane.showMessageDialog(null,e);
}

【问题讨论】:

  • 发布*.com/help/mcve
  • 嗯,错误是项目代码对于 varchar(45) 来说太长了。您还绝对需要了解准备好的语句 (docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html),因为一旦其中一个文本字段包含单引号,您的代码就会失败,并且它会受到 SQL 注入攻击。它们还允许将日期存储为日期,而不必使用特定于数据库、特定于语言环境的格式对其进行格式化。最后,它们使代码更具可读性且不易出错。

标签: java mysql updates truncate


【解决方案1】:

独立于您的代码有一些弱点,我建议验证模型实体的不同字段,具体取决于数据库表上具有相应列的限制。 希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您保留的数据比预期的要长。 数据库中的 item_codeat 列只需要小于或等于 45 个字符的字符串。

    解决方案

    1 - 如果您可以更改您的数据库。将 item_codeat 的数据类型更改为 TEXT

    2- 如果您无法更改数据库,则需要进行某种验证以限制客户端/用户输入长度小于 45 的有效 item_codeat

    【讨论】: