[SQL] Incorrect string value, Data too long for column

 

게시판 create 함수를 작성하던 와중 250자 정도 까지는 작성이 가능하지만, 이상의 글자수에 대해서는 오류를 반환하는 것을 볼 수 있었다. 로컬환경에서는 제대로 실행되었으며 prod 환경에서 실행했을 때만 오류가 발생하였다. 

java.sql.SQLSyntaxErrorException: (conn=158694) Data too long for column 'content' at row 1

 

 

post 의 domain의 어노테이션 안에 TEXT를 넣어 해결하였다. 그런데 이를 배포한 뒤에도 클라이언트 측에서는 여전히 오류가 난다고 하여 잘못된 요청을 하고있는 게 아닐까? 라고 생각했다.

 @Column(nullable = false, columnDefinition = "TEXT")
 private String content;

 

 

 

local 과 prod 환경이 아무런 차이가 없다고 생각하여 로컬에서만 시도하고 있었는데, prod에서 시도해 보았을 때 나에게도 동일한 에러가 발생하고 있었다. SQL 문이 잘못되었다는 에러였다. 

java.sql.SQLSyntaxErrorException: (conn=164398) Incorrect string value: '\xE3\x85\x8DLor...' for column `patientpal`.`posts`.`content` at row 1

위 에러는 해당 문자열이 컬럼의 문자 집합(character set)과 호환되지 않는 경우, 주로 입력하려는 문자열이 컬럼의 문자 집합으로 표현될 수 없는 경우에 발생한다.

 

 

 

lcoal 환경은 H2 , prod 환경은 MariaDB를 사용하고 있었는데 여기서 오는 차이였던 것이다.

  • H2: 기본적으로 UTF-8을 사용하며, 문자 집합에 대한 제한이 명확하지 않거나 유연하게 설정될 수 있다.
  • MariaDB: utf8과 utf8mb4는 문자당 저장되는 바이트 수가 다르다. utf8은 최대 3바이트를 사용하고, utf8mb4는 최대 4바이트를 사용.

 

 

운영 환경(MariaDB)에서 utf8mb4로 설정해주어야 UTF-8의 모든 문자를 지원하며, 4바이트 문자를 포함한 모든 유니코드 문자도 올바르게 저장할 수 있다.

 

더 많은 바이트 수를 사용하는 utf8mb4로 설정해주어야 too long 에러가 해결되는 것이 이상하다고 생각했는데, 생각해보니 이것은  @Column(nullable = false, columnDefinition = "TEXT") 로 해결이 되었고, 이후부터는 인코딩 호환의 문제여서 utf8mb4 로 설정해주어야 하는 것이었다.

 

아래와 같이 sql 을 설정해줌으로써 해결하였다.

ALTER TABLE posts MODIFY COLUMN content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;