java - Java 和 MySQL 中枚举的数据截断 (java.sql.SQLException: Data truncated for ...)
问题描述
我有一个自定义类,它代表一个 .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 行的列“状态”的数据被截断
这是数据库上传的代码:
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());
解决方案
我相信 SQL 上的枚举类型存储为数字。它的大小是 1 或 2 个字节。如果要存储状态字段的文本版本,则将该列声明为 varchar。或者你应该存储状态的序数。
推荐阅读
- java - submit() 不适用于 Selenium API
- c# - 循环语法中的 C# 错误
- google-bigquery - 如何从 BigQuery 导出到数据存储区?
- docker - Docker 容器中的 TurboVnc 服务器和其他容器中的 VirtualGL?
- reactjs - 400 上 axios 模型的 nock 不返回定义的值
- javascript - 如何在 django 中将提交按钮与 javascript 函数链接?
- sql-server - 我们什么时候应该关注磁盘 I/O?
- python - 从文件读取后获取特定元素
- spring-mvc - 获取基于 Spring Boot 的 Web 应用程序的请求 url
- python - 运行龙卷风应用程序时如何关闭终端?