当前位置: 首页 > 知识库问答 >
问题:

Java和MySQL中枚举的数据截断(java.sql.SQLException:数据截断…)

戚翼
2023-03-14

我有一个代表. csv文件结构的自定义类,它稍后会读入该类的arrayList。它有以下标签:

public class InputFile {

public enum Status {
    IN_STOCK,
    OUT_OF_STOCK
}

private int lineNumber;
private String sku;
private Status statusCode;
private Date orderDate;

public InputFile(int lineNumber, String sku, Status status, Date orderDate) {
    this.lineNumber = lineNumber;
    this.sku = sku;
    statusCode = status;
    setOrderDate(orderDate);
}

public Status getStatusCode() {
    return statusCode;
}

public void setStatusCode(Status input) {
    statusCode = input;
}

这是简化的. csv文件:

LineNumber;SKU;Status;OrderDate
1;553555254;IN_STOCK;2018-04-21
2;668470653;IN_STOCK;2018-05-08
3;899395925;OUT_OF_STOCK;2018-06-06

当我将这些读入arrayList并将各个状态放在consolse上只是为了检查时,它会正确显示(IN_STOCK,OUT_OF_STOCK)。但是,当我尝试将其插入数据库时,它会被截断:

java.sql.SQLException:第1行的列“Status”的数据被截断

以下是数据库上传的代码:

try {
     String orderItemQuery = "INSERT INTO `order_processing`.`order_item` (`OrderItemId`, `OrderId`, `SalePrice`, `ShippingPrice`, `Sku`, `Status`)" + "VALUES (?, ?, ?, ?, ?, ?)";

     PreparedStatement orderItemStmt = conn.prepareStatement(orderItemQuery);
     for (InputFile i : CSVManager.getList())
     {
         orderItemStmt.setInt (1, i.getOrderItemId());
         orderItemStmt.setInt(2,i.getOrderId());
         orderItemStmt.setDouble (3, i.getSalePrice());
         orderItemStmt.setDouble (4, i.getShippingPrice());
         orderItemStmt.setString (5, i.getSku());
         orderItemStmt.setObject(6, InputFile.Status.valueOf(i.getStatusCode().toString()));
         orderItemStmt.execute();
        }
    }
    catch (Exception e)
    {
        ...
    }

这是。数据库表的sql:

create table order_item
(
  OrderItemId    int         not null
    primary key,
  OrderId        int         not null,
  SalePrice      decimal     not null,
  ShippingPrice  decimal     not null,
  TotalItemPrice decimal AS (ShippingPrice + SalePrice) not null,
  SKU            varchar(25) not null,
  Status         enum ('OUT_OF_STOCK', 'IN_STOCK') not null,
  constraint order_item_order_OrderId_fk
    foreign key (OrderId) references `order` (OrderId)
);

缺少了什么?为什么枚举被截断?

编辑:问题是Java枚举类型的序号与MYSQL不同。Java从0开始计数,而MYSQL从1开始计数。为了解决这个问题,需要修改枚举中的序号列表:

    public enum Status {
    OUT_OF_STOCK (1),
    IN_STOCK (2);

    private int status;

    private Status (final int status) {
        this.status = status;
    }

    public int getStatus() {
        return status;
    }
}

然后将数据插入数据库是示例:

orderItemStmt.setInt(6, i.getStatusCode().getStatus());

共有2个答案

呼延曜灿
2023-03-14

使用状态。值Of(“IN_STOCK”)和IN_STOCK。name()将数据保存到数据库时。

祖奇
2023-03-14

我相信SQL上的枚举类型存储为数字。它的大小是1或2个字节。如果您想存储状态字段的文本版本,则将该列声明为varchar。或者您应该存储状态的序号。

 类似资料:
  • 我对Laravel截断的数据有一个小问题。我将传递给我的后端值,该值可以是表中定义的“百分比”或“金额”,但在表中也可以为null,但每次尝试将其设置为null时,都会出现如下错误: {"discount_currency":["您输入的值无效。"]} 或者当我从处理请求中删除enum时,它会说 所以我传递数据抛出API从我的Vue,这个婴儿车的请求看起来像: 所以如果我删除...我有第二个错误。

  • 我有我的班级电影: 和我的控制器方法: 我得到一个错误: Servlet.service()的servlet[springDispatcher]在上下文与路径[/web编程]抛出异常[请求处理失败;嵌套异常org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];嵌套异常是org.hibernate.except

  • 问题内容: 在更改MySql列的数据类型以存储Twilio调用 ID(34个字符字符串)之后,我尝试使用以下方法手动更改该列中的数据: 但是,我看到一个错误,因为正确修改了列的数据类型,所以没有意义吗? 问题答案: 您的问题是,目前您的栏定义为应在何时。 要解决此问题,只需发出此命令即可将列的长度从1更改为34 这是 SQLFiddle 演示

  • 问题内容: 我用来将数据框导出到mysql中。但是,我发现具有长字符串内容(例如url)的列被截断为63位数字。导出时,我从ipython笔记本收到以下警告: /usr/local/lib/python2.7/site- packages/pandas/io/sql.py:248:警告:第3行cur.executemany(insert_query,data)的列’url’的数据被截断了 对于不同

  • 我用下面的代码创建了一个JFreeChart,但是y轴标记被截断了。即使数据点在y轴上重叠,我应该如何显示图表?基本上,我希望Y轴点从我的文件生成,一个适当的范围是填充和显示在图表中。 下面是创建的图像,很明显你可以看到Y轴有一个重叠显示。

  • 在更改MySql列的数据类型以存储Twilio调用ID(34个字符字符串)后,我尝试使用以下命令手动更改该列中的数据: 但是,我收到一个错误,看到列的数据类型被正确修改而没有意义?