본문 바로가기
Computer Science/Database

[JPA/MySQL] Specified key was too long; max key length is 1000 bytes

by 돈코츠라멘 2019. 9. 12.

증상

Spring Boot Application을 시작할 때 Hibernates가 테이블을 생성하는 시점에서 에러 발생

Caused by: java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:782) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:666) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-3.2.0.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-3.2.0.jar:na]
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
    ... 34 common frames omitted

원인

  • MySQL은 1000 byte 이상의 컬럼을 Key로 지정할 수 없음
  • 따라서 다른 인코딩 방식을 사용하다가 utf8로 migration 한 경우에도 발생할 수 있음
  • 인코딩 방식마다 1 character가 사용하는 byte의 수가 다르기 때문
    (latin1 = 1 byte = 1 character, uft8 = 3 byte = 1 character)

해결

  • 1 chararcter당 byte를 적게 사용하는 인코딩 방식으로 변경
  • 또는 Key로 사용될 컬럼의 character 길이를 제한

댓글