본문 바로가기
Programming/DB (SQL)

MySQL 8.x에서 변경된 예약어 및 날짜비교

by 곰네Zip 2022. 9. 14.

서버에 있는 DB를 테스트용으로 로컬에 설치했다. 그러면서 버전을 8.0.29로 설치했다. (서버는 5.x)

그랬더니.. 멀쩡히 잘 돌던 쿼리가 오류를 막 뱉어낸다.

알고보니.. 쿼리중에 GROUPS라는 이름을 붙여서 쓰고있었는데..

이것이 예약어가 되어버린것.

그래서 해당 예약어를 찾아서 모두 ` (1옆에 있는 키)를 앞 뒤로 감싸주어 해결.

추가된 예약어들 목록은..

https://dev.mysql.com/doc/refman/8.0/en/keywords.html

 

MySQL :: MySQL 8.0 Reference Manual :: 9.3 Keywords and Reserved Words

9.3 Keywords and Reserved Words Keywords are words that have significance in SQL. Certain keywords, such as SELECT, DELETE, or BIGINT, are reserved and require special treatment for use as identifiers such as table and column names. This may also be true

dev.mysql.com

위 링크에 들어가면 찾을 수 있다.

 

그리고 추가로.. 해당 월의 데이터를 찾기 위한 쿼리를 실행할 때 발견한 부분.

 DateTime의 경우 비교 시, 'YYYY-MM-DD'형태만 비교 가능하다. 5.x에서는 'YYYYMMDD'형태로 검색이 가능했으나 8.x부터는 허용이 안된다고..  그래서 비교시 다음과 같이 수정해야한다.

SELECT .. FROM MyTable mt
	WHERE mt.Date BETWEEN '20220901' AND '20220931' << 실패
    WHERE mt.Date BETWEEN '2022-09-01' AND '2022-09-30' << 성공
    WHERE DATE_FORMAT(mt.Date, '%Y%m%d') BETWEEN '20220901' AND '20220931' << 성공
    WHERE mt.Date BETWEEN '2022-09-01' AND '2022-09-31' << 실패

YYYYMMDD형태로 비교하고싶으면 DateTime 데이터를 DATE_FORMAT을 이용하여 YYYYMMDD형태로 만든 후 비교 가능하다. 아니면 YYYY-MM-DD형태로 비교할것. 대신, 마지막 실패 case처럼 존재하지 않는 날짜로 비교하려고하면 오류발생함.

 -> YYYY-MM-DD형태로 비교하려면 월별로 날짜가 맞는지 확인하는 로직 필요하다.

그러니.. 월별로 마지막날짜를 맞추어서 해당 월에 들어가는 마지막 날을 전달해줘야한다.

귀찮으면 DATE_FORMAT을 활용하자.

반응형

댓글