MYSQL JSON (1)

💻 Programming

[MySQL] json 컬럼 업데이트 안되는 현상

mysql(AWS aurora aurora_version,2.07.1, innodb_version,5.7.12)에서 json 타입 컬럼을 지원하고 있고 json string을 저장해야할 일이 생겨 오랜만에 해당 타입으로 컬럼을 정의하여 사용했는데 컬럼의 내용이 업데이트가 안되는 현상을 확인했다. 문제가 생긴 데이터는 double 값을 포함하는 좌표데이터였다.

 

{"latitude": 24.4436779, "longitude": 116.35241670000043}

 

이런 데이터였는데 문제가 생긴 부분은 longitude 였다.

 

유닛테스트(java correto 11)에서 확인 시에 업데이트된 값이 제일 끝에 한자리가 바뀌어서 116.35241670000045 로 콘솔에 출력되었는데 jpa 업데이트 시 업데이트가 발생하지 않았다.

 

update일시 컬럼(timestamp)에 on update current_timestamp 설정이 되어있음에도 업데이트 일시가 변경되지 않았다.

 

쿼리를 아래와 같이 직접 날려도 마찬가지였다 -_-; 여기서 좀 멘붕;;

update location set coordinate = '{"latitude": 24.4436779, "longitude": 116.35241670000045}' where id=1;

jpa가 어떻게 쿼리를 날렸는지 확인해보니 직접 쿼리를 날린 것과 동일했다.

 

애초에 해당 데이터가 업데이트가 제대로 안되는 것을 확인했을 때 어차피 string으로 전달하기 때문에 double precision이 문제가 될거라는 생각은 없었으나, 구글링을 하면 할 수록 문제가 될만한건 double precision 밖에 없어보였다.

 

검색어를 좀 바꿔서 double precision 관련해서 찾아보니 double precision의 경우 16자리까지 ( . 제외하고 숫자만 셋을 때) 정확히 표한할 수 있다고 한다. 문제가 되었던 케이스는 총 17자리의 소수점이었고 따라서 마지막 자리수에 대한 정확도가 떨어지게 된 것이다.

 

해당 문제를 해결하려면 value의 타입을 double이 아닌 string으로 변경하여 저장할 필요가 있어보였으나, 좌표에 대한 자리수가 저렇게 긴게 맞는 것인지 확인해보니 좌표 데이터 저장시 8자리 이상은 노이즈값이라고 생각하고 저장할 필요가 없을것 같았다. -> 위키 참고

 

따라서 해당 이슈는 저장하는 쪽은 이슈가 없고 가져다 쓰는 쪽에서 잘 가져다 쓰면 될 문제였다.

 

오랜만에 야근했으나 또하나 알게된 것이 있어 기쁜 하루였다~

 

 

[참고내용]

stackoverflow.com/questions/49119871/mysql-json-stores-different-floating-point-value