βš™οΈ Trouble Shooting

[TS] JPA error - Specified key was too long; max key length is 1000 bytes

개발자 HOON 2023. 3. 23. 22:25

 

ν”„λ‘œμ νŠΈ 개발 도쀑, ν•œ μ‚¬λžŒλ‹Ή ν•˜λ‚˜μ˜ 계정과 멀버 μ†Œμ†μ„ κ°€μ§ˆ 수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œ, unique ν‚€λ₯Ό μ„€μ •ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹Ήμ‹œ unique ν‚€λ‘œ μ§€μ •ν•œ 것은, 이름과 tel1, tel2, tel3와 같은 μ „ν™”λ²ˆν˜Έλ₯Ό κΈ°μ€€μœΌλ‘œ unique ν‚€λ₯Ό μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€. 그러자 ν•˜λ‹¨κ³Ό 같은 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

Specified key was too long; max key length is 1000 bytes

 

μš°μ„ , λ‹Ήμ‹œ Javaμ—μ„œ μ—”ν‹°ν‹° 객체λ₯Ό 생성할 λ•Œ 이름과 tel1, tel2, tel3에 λŒ€ν•΄μ„œ String νƒ€μž…μœΌλ‘œ μ„€μ •ν•˜κ³  μ–΄λ– ν•œ μ œν•œμ„ 두지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

JPAμ—μ„œ spring.jpa.hibernate.ddl-auto=create μ˜΅μ…˜μœΌλ‘œ μžλ™μœΌλ‘œ ν…Œμ΄λΈ”μ„ 생성할 λ•Œ MyISAM 엔진을 μ‚¬μš©ν•œλ‹€λ©΄, 캐릭터셋이 utf8mb4둜 λ§Œλ“­λ‹ˆλ‹€. utf8 이면 1κΈ€μžλ‹Ή 3λ°”μ΄νŠΈ 인 반면, utf8mb4λŠ” 4λ°”μ΄νŠΈμž…λ‹ˆλ‹€.
λ”°λΌμ„œ String νƒ€μž…μœΌλ‘œ μ„€μ •ν•œ ν•΄λ‹Ή 컬럼의 νƒ€μž…μ΄ varchar(255)둜 μ„€μ • 되고, μ΄λŠ” 255*4 κ°€ 1020 을 μž‘κ²Œλ˜μ–΄ 1000 λ°”μ΄νŠΈλ₯Ό μ΄ˆκ³Όν•˜λ©΄μ„œ μœ„μ™€ 같은 μ—λŸ¬κ°€ λ°œμƒν•œ κ²ƒμž…λ‹ˆλ‹€.

 

첫 번째둜 ν•΄κ²°ν•œ 것은, length μ‘°μ ˆμž…λ‹ˆλ‹€.

말 κ·ΈλŒ€λ‘œ, max key lengthκ°€ 1000 λ°”μ΄νŠΈλ‘œ μ œν•œμ΄ κ±Έλ €μžˆμœΌλ‹ˆ, unique ν‚€λ‘œ μ„€μ •ν•˜λ €λŠ” λŒ€μƒμ— λŒ€ν•΄μ„œ 길이 μ œν•œμ„ κ±Έλ©΄ λ©λ‹ˆλ‹€.

이름은 λŒ€λΆ€λΆ„ 3κΈ€μžμ΄λ©°, 아무리 νŠΉμˆ˜ν•œ κ²½μš°λΌλ„ 10κΈ€μž 이상 λ„˜μ–΄κ°€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ „ν™”λ²ˆν˜Έμ™€ 같은 경우, tel1, tel2, telλŠ” 각각 3자리, 4자리, 4자리λ₯Ό ν¬ν•¨ν•˜λ―€λ‘œ length둜 길이 μ œν•œμ„ 두면 λ©λ‹ˆλ‹€.

 

 

μ΄λŸ¬ν•œ λ³€ν™”λ₯Ό μ€€ 이후, ν•΄λ‹Ή 였λ₯˜κ°€ 사라지고 잘 μ„€μ •λœ 것을 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 

 

두 번째 ν•΄κ²° λ°©λ²•μœΌλ‘œ, InnoDB둜의 λ³€κ²½μž…λ‹ˆλ‹€.

기쑴의 application.yml μ„€μ • 쀑 μΌλΆ€μž…λ‹ˆλ‹€.

 spring:
     jpa:
        database-platform: org.hibernate.dialect.MySQLDialect
     hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQL5Dialect

 

database-platformκ³Ό properties.hibernate.dialectλ₯Ό MySQL5InnoDBDialect둜 λ³€κ²½ν•΄μ£Όλ©΄, MyISAM이 μ•„λ‹ˆλΌ InnoDBλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 spring:
     jpa:
        database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
     hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect

 

 

- MyISAM의 μœ λ‹ˆν¬ ν‚€ λ°”μ΄νŠΈ μ œν•œ : 1000 λ°”μ΄νŠΈ μ œν•œ
- InnoDB의 μœ λ‹ˆν¬ ν‚€ λ°”μ΄νŠΈ μ œν•œ : 3072 λ°”μ΄νŠΈ μ œν•œ (두 개 μ΄μƒμ˜ 열을 ν¬ν•¨ν•˜λŠ” 인덱슀의 경우)

 

λ”°λΌμ„œ, MyISAMμ—μ„œ InnoDB둜의 μ „ν™˜λ§ŒμœΌλ‘œλ„, μœ λ‹ˆν¬ ν‚€μ˜ λ°”μ΄νŠΈ μ œν•œμ„ κ°œμ„ μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.