【问题标题】:How to Avoid 'Data truncated for column' in Mysql Database Using java?如何使用java避免Mysql数据库中的“列数据被截断”?
【发布时间】:2012-12-19 10:44:37
【问题描述】:

在我的 Java 程序中..Hibernate Bean 类定义一列,如..

TimtableVO.java

@Column(name="REPEAT_DAYS")
private WeekdayType repeatDays;//hear WeekdayType is Enum Class

在我的服务类中,我使用这个 TimetableVO.java bean 类作为..

这是我的服务类:

public void createEvent(TimetableVO timetableVO) {
    WeekdayType weekday = null;
    for (String day : timetableVO.getTemp().split(",")) {
        weekday = WeekdayType.valueOf(day);
    }
    timetableVO.setRepeatDays(weekday);
    userDAO.createEvent(timetableVO);
}

我的 DAO 类正在插入 timetableVO 对象..

public void createEvent(TimetableVO timetableVO) throws DataAccessException {
    entityManager.persist(timetableVO);
}

但是异常会来..

Exception: Caused by: java.sql.BatchUpdateException: Data truncated for column 'REPEAT_DAYS' at row 1
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2045)
    at coHibernate: insert into EC_TIMETABLE (CLASS_DURATION, COURSE_DURATION, COURSE_FEE, END_DATE, REPEAT_COUNT, REPEAT_DAYS, REPEAT_TYPE, SEARCH_KEY, START_DATE, S_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
m.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1468)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
    ... 65 more
Caused by: java.sql.SQLException: Data truncated for column 'REPEAT_DAYS' at row 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

编辑: 这是我的 WeekdayType 枚举

public enum WeekdayType {
    MONDAY(Calendar.MONDAY), TUESDAY(Calendar.TUESDAY), WEDNESDAY(
    Calendar.WEDNESDAY), THURSDAY(Calendar.THURSDAY), FRIDAY(
    Calendar.FRIDAY), SATURDAY(Calendar.SATURDAY), SUNDAY(
    Calendar.SUNDAY);

    private int day;

    private WeekdayType(int day) {
        this.day = day;
    }

    public int getDay() {
        return day;
    }
}

【问题讨论】:

  • 向我们展示您的 WeekdayType
  • REPEAT_DAYS的数据类型是什么
  • 一个枚举类型....即,WeekdayType。

标签: java mysql spring hibernate


【解决方案1】:

这可能是由于表架构中的 ENUM 没有您尝试插入的所有值造成的。类似的东西:

CREATE TABLE IF NOT EXISTS event (
    weekday_type ENUM(
        'SUNDAY',
        'MONDAY',
        'TUESDAY',
        'WEDNESDAY',
        'THURSDAY',
        'FRIDAY'
    ) NOT NULL
);

然后当你执行像

这样的插入时
INSERT INTO event (weekday_type) VALUES ('SATURDAY');

使用 JDBC 你会得到一个类似的异常:Data truncated for column 'weekday_type' at row 1,因为你忘记在你的表定义中包含SATURDAY。当插入发生时,值将 truncated 变为空。

【讨论】:

  • 这个!我有同样的问题,然后当我检查我的表定义时,有一个错字THRUSDAY 而不是THURSDAY
【解决方案2】:

看起来错误是由于REPEAT_DAYS 列太小而无法保存您通过WeekdayType 枚举传递的值。因此,重新检查下级数据库中该列的定义并最终增加它的大小。

您还缺少注释:

 @Column(name="REPEAT_DAYS", length="45")
 @Enumerated(EnumType.STRING)
 private WeekdayType repeatDays;

注释中的length 应与数据库架构中列的长度相匹配。

【讨论】:

  • 实际上,当我创建数据库时,我写了 Enum('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY') 就像这只...如何定义它的长度?
  • 您是通过 Hibernate 创建数据库架构吗?
  • NO.. 我正在为 Db 使用 Phpadmin 并删除 hbm2ddl.auto 的属性
【解决方案3】:

您的服务器似乎在严格模式下运行,您可能会尝试在 NOT NULL 列中插入 NULL。

参见此处:What is this error? "Database query failed: Data truncated for column 'column_name' at row 1

【讨论】:

    【解决方案4】:

    仅当您尝试插入一个太长而无法容纳一列的值时,才会出现此问题。 在您的情况下,REPEAT_DAYS 的列定义不足以保持您的价值。 你也不能像

    这样注释枚举类型
    @Column(name="REPEAT_DAYS")
    
    private WeekdayType repeatDays;
    

    相反,您可以执行类似的操作

    @Enumerated(EnumType.STRING) 并像这样定义您的枚举

    enum Fruits {
      apple,
      orange
    }
    

    【讨论】:

      【解决方案5】:

      假设您的表是由休眠自动生成的,您不能像以前那样注释 Enum 类型

      @Column(name="REPEAT_DAYS")

      private WeekdayType repeatDays;

      检查@Enumerated(EnumType.STRING)注解

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多