Database·SQL

[MySQL] The server time zone value is unrecognized or represents more than one time zone μ—λŸ¬ ν•΄κ²° 방법

Leica 2020. 2. 9. 04:19
λ°˜μ‘ν˜•

The server time zone value is unrecognized or represents more than one time zone μ—λŸ¬ ν•΄κ²° λ°©λ²•

Javaμ—μ„œ 둜컬 MySQL μ„œλ²„μ— μ—°κ²°ν•˜λ˜ 쀑 μ•„λž˜μ™€ 같은 μ—λŸ¬κ°€ λ°œμƒν–ˆλ‹€.

 

java.sql.SQLException: The server time zone value is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

 

ν•΄μ„ν•˜λ©΄ 'μ„œλ²„ μ‹œκ°„λŒ€ 값이 μΈμ‹λ˜μ§€ μ•Šκ±°λ‚˜ λ‘˜ μ΄μƒμ˜ μ‹œκ°„λŒ€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. μ„œλ²„ λ˜λŠ” JDBC λ“œλΌμ΄λ²„(serverTimezone configuration propertyλ₯Ό 톡해)λ₯Ό κ΅¬μ„±ν•˜μ—¬ 더 ꡬ체적인 ν‘œμ€€ μ‹œκ°„λŒ€ 값을 μ‚¬μš©ν•΄μ•Όν•œλ‹€.' λΌλŠ” λœ»μ΄λ‹€.

 

ν˜„μž¬ MySQL의 GLOBAL(μ „μ—­) 및 SESSION time zone(μ‹œκ°„λŒ€) 값은 λ‹€μŒκ³Ό 같이 확인할 수 μžˆλ‹€.

 

SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;

'SYSTEM'은 MySQL μ„œλ²„ μ‹œκ°„λŒ€κ°€ μ‹œμŠ€ν…œ μ‹œκ°„λŒ€μ™€ λ™μΌν•œ κ²ƒμœΌλ‘œμ¨ ꡬ체적인 λͺ…μ‹œκ°€ λ˜μ–΄μžˆμ§€ μ•ŠμŒμ„ λ‚˜νƒ€λ‚Έλ‹€. 이 λ•Œλ¬Έμ— Exception이 λ°œμƒν•œ 것이닀. μ•„λž˜μ˜ 방법 쀑 ν•˜λ‚˜λ₯Ό νƒν•˜μ—¬ μ‹œκ°„λŒ€λ₯Ό μ§€μ •ν•˜λ©΄ ν•΄κ²°λœλ‹€.

 

방법 1: SET Statement μ‹€ν–‰

이 방법은 λŸ°νƒ€μž„μ— μ„œλ²„ μ‹œκ°„λŒ€ 값을 μ„€μ •ν•  수 μžˆλ‹€. μ‹œκ°„λŒ€λŠ” UTCλ‘œλΆ€ν„°μ˜ μ˜€ν”„μ…‹μ„ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄λ‘œ 지정할 수 μžˆλ‹€. UTC둜 μ§€μ •ν•˜λ €λ©΄ '+0:00'으둜, KST둜 μ§€μ •ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 '+9:00'으둜 지정해주면 λœλ‹€.

 

SET GLOBAL time_zone = '+9:00';    # κΆŒν•œ ν•„μš”
SET time_zone = '+9:00';

 

SET GLOBAL time_zone은 μ‹€ν–‰ν•˜λ €λ©΄ κΆŒν•œμ΄ ν•„μš”ν•˜λ‹€.

 

방법 2: default-time-zone μ˜΅μ…˜ 지정

이 방법은 μ„œλ²„ μž¬κΈ°λ™μ΄ ν•„μš”ν•˜λ‹€. μ„œλ²„ ꡬ동 μ‹œ λͺ…령쀄에 --default-time-zone μ˜΅μ…˜μ„ μ‚¬μš©ν•˜κ±°λ‚˜ my.ini 파일의 [mysqld]에 μΆ”κ°€ν•œλ‹€.

 

my.ini에 default-time-zone μ˜΅μ…˜ μΆ”κ°€


my.ini μˆ˜μ • ν›„ MySQL μ„œλ²„λ₯Ό μž¬κΈ°λ™ν•œλ‹€.

 

방법1 λ˜λŠ” 방법2λ₯Ό μ μš©ν•˜λ©΄ μ•„λž˜μ™€ 같이 MySQL μ„œλ²„ μ‹œκ°„λŒ€κ°€ λ³€κ²½λ˜λ©° μžλ°”μ—μ„œ μ •μƒμ μœΌλ‘œ μ—°κ²°ν•  수 μžˆλ‹€.

 

방법1 λ˜λŠ” 방법2 적용 ν›„ μ„œλ²„ μ‹œκ°„λŒ€

 

방법 3: JDBC Properties μ„€μ •

이 방법은 MySQL μ„œλ²„μ™€ 상관 없이 JDBC와 μ—°κ²° μ‹œ 속성값을 μ„€μ •ν•΄μ„œ μ‹œκ°„λŒ€λ₯Ό override(μž¬μ •μ˜)ν•˜λŠ” 방법이닀. MySQL μ„œλ²„ μ‹œκ°„λŒ€κ°€ λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

 

μ—°κ²° λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ serverTimezone propertyλ₯Ό λ„˜κΈ°κ±°λ‚˜ JDBC URL에 μΆ”κ°€ν•œλ‹€.

단 MySQL μ„œλ²„μ˜ μ‹œκ°„λŒ€λ₯Ό μ§€μ •ν•˜λŠ” 것과 달리 ν•œκ΅­ μ‹œκ°„μ€ Asia/Seoul 값을 지정해야 ν•œλ‹€.

 

properties.setProperty("serverTimezone", "Asia/Seoul");
try {
    DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/knou", properties);

<Properties 객체에 λ‹΄μ•„ λ„˜κ²¨μ„œ μ„€μ •>

 

try {
    DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/knou?serverTimezone=Asia/Seoul", properties);

<JDBC URL에 λΆ™μ—¬μ„œ μ„€μ •>

 

참고둜 serverTimezone은 μ„œλ²„μ˜ ν‘œμ€€ μ‹œκ°„λŒ€κ°€ Java ν‘œμ€€ μ‹œκ°„λŒ€λ‘œ λ§€ν•‘λ˜μ§€ μ•Šμ„ λ•Œ μ‚¬μš©λ˜λŠ” 속성이닀.

 

References

https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html

https://offbyone.tistory.com/318

λ°˜μ‘ν˜•