programing

데이터 잘라내기:1행의 'logo' 열에 대한 데이터가 너무 깁니다.

newsource 2022. 12. 6. 22:02

데이터 잘라내기:1행의 'logo' 열에 대한 데이터가 너무 깁니다.

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 = 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();
    }

이 문제는 어떻게 해결하나요?

열에 허용된 것보다 큰 데이터를 삽입하려고 합니다.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이 예외를 피하기 위해

데이터 유형 사용LONGBLOB대신BLOB를 참조해 주세요.

저는 다음 솔루션이 효과가 있었습니다.db에 연결할 때 데이터가 너무 길면 잘라내야 함을 지정합니다(jdbc ComplianceTruncation).내 링크는 다음과 같습니다.

jdbc:mysql://SERVER:PORT_NO/SCHEMA?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false

문자열 크기를 늘리면 나중에 DB에 저장하려는 문자열이 새 크기보다 길면 동일한 문제가 발생할 수 있습니다.

편집: STRICT_TRANS_탭LES도 sql_mode에서 삭제해야 합니다.

일반적으로 문자열은 짧은 텍스트에 사용해야 합니다.디폴트로는VARCHAR(255)

솔루션:엔티티에서 길이가 있는 주석 @Column을 사용합니다.

예:

@Entity
public class Users {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     private String email;
     //..
     @Column(length = 1000) //1000 will be fine
     private String imgProfile;
}

언급URL : https://stackoverflow.com/questions/21522875/data-truncation-data-too-long-for-column-logo-at-row-1