Java 数据截断:列';标志';在第一排
我试图将照片插入MySQL表的BLOB列,但出现了一个异常:Java 数据截断:列';标志';在第一排,java,mysql,jdbc,Java,Mysql,Jdbc,我试图将照片插入MySQL表的BLOB列,但出现了一个异常: Data too long for column 'logo' at row 1. 以下是JDBC: int idRestaurant = 42; String restoname= "test"; String restostatus= "test"; InputStream fileContent = getUploadedFile(); int fileSize = getUplo
Data too long for column 'logo' at row 1.
以下是JDBC:
int idRestaurant = 42;
String restoname= "test";
String restostatus= "test";
InputStream fileContent = getUploadedFile();
int fileSize = getUploadedFileSize();
Class.forName("com.mysql.jdbc.Driver");
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/resto" , "root" , "" )) {
PreparedStatement ps = conn.prepareStatement("insert into restaurants (idRestaurant, restaurantName, status, logo) values(?,?,?,?)");
ps.setInt(1, idRestaurant);
ps.setString(2, restoname);
ps.setString(3, restostatus);
ps.setBinaryStream(4, fileContent, fileSize);
ps.executeUpdate();
conn.commit();
}
如何解决此问题?在数据库表中使用数据类型
LONGBLOB
而不是BLOB
。您试图插入的数据大于logo
列允许的数据
根据需要使用以下数据类型
TINYBLOB : maximum length of 255 bytes
BLOB : maximum length of 65,535 bytes
MEDIUMBLOB : maximum length of 16,777,215 bytes
LONGBLOB : maximum length of 4,294,967,295 bytes
使用
LONGBLOB
避免此异常。以下解决方案对我有效。连接到数据库时,指定如果数据太长,则应截断数据(jdbcomplianttruncation)。我的链接如下所示:
jdbc:mysql://SERVER:PORT_NO/SCHEMA?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false
如果您增加字符串的大小,如果您试图存储到DB中的字符串比新的大小长,则将来可能会遇到相同的问题
编辑:严格的转换表也必须从sql模式中删除。您有三种选择来解决此问题。1.增加列数据类型的大小。2.减小插入该列的内容的大小。3.不要插入信息。我有一个长度为50的VARCHAR字段,这个字符串“amsterdam 12234 2^”(&*| |)即使长度小于50,也会给我同样的错误。数据格式也有任何限制吗?这部分“jdbcomplianttrunation=false”这是我真正需要的,因为首先我删除了严格的转换表,但没有任何效果。非常感谢!