이번에 서버 업데이트를 하나 했는데,
갑자기 엉뚱한 부분에서 에러가 터졌다.
그저 프로시저실행하는 코드고 해당 코드는 건든적이 없었는데..
프로시저 안에 일이기 때문에 아무리 디버깅을 해봐도 소용이 없었다..
이리 저리 로그를 찍어보다가... 깨달았는데
"1234455673939"이런식으로 string으로 전달되었던 인자가 프로시저 내부에서
"1.xxxxxx"형태의 부동소수점형태로 변환되어 전달되고 있었다..
해당 내용에 대해 gpt에게 물어보니
이러한 대답을 받을 수 있었다..
내부적으로 mysql에서 숫자형태의 varchar을 부동소수점방식으로 변환한다는것이다..
mysql의 묵시적 형 변환에 대해 구글링을 해봐도, 요즘에 프로시저를 잘 사용하지 않는것인지
많은 검색결과를 얻을 수 없었다.
그래서 gpt에게 다시 물어본 결과
✅ 방법 1: 명확하게 문자열로 감싸기
쿼리 실행 시 강제로 문자열로 취급하도록 따옴표('')를 사용하세요.
INSERT INTO my_table (my_varchar_column) VALUES ('109958166097066644827');
✅ 방법 2: CAST() 또는 CONVERT() 사용하기
MySQL에서 명시적으로 VARCHAR로 변환하여 저장
INSERT INTO my_table (my_varchar_column) VALUES (CAST(109958166097066644827 AS CHAR));
INSERT INTO my_table (my_varchar_column) VALUES (CONVERT(109958166097066644827, CHAR));
SET my_varchar_column = CAST(my_varchar_column AS CHAR);
의 대답을 얻을 수 있었다.
처음엔 프로시저를 먼저 고쳐봤다.
인자를 받을 varchar을 64 -> 255 로 늘려도보고, 2번의 변환도 시도해보았다.
다만 문제는.. 프로시저에 인자를 넘어올때 이미 mysql에서 변환을 해서 넘어와서,
프로시저 내부에서 변환을 해도 이미 변환된 값을 string형태로 받을 뿐이였다.
그래서 다음으로 방법1을 선택을 했지만..
해당 방법또한 나에게 는 해결방법이 되어주지 않았다.
그래서 마지막으로 나랑 사수님과 같이 해결방법을 모색하였는데..
- 문제가 되는 부분이 첫문단이니, 첫 문단을 프로시저에서 분리하자.
- 숫자형태가 문제라면, base64로 값을 변환해서 값을 보내고, 프로시저내부에서 풀어서 해결
이 중에서사실 어떤걸 먼저해도 상관없었지만..
기존의 프로시저 형태는 계속 가져가고싶어서 2번을 택하였고 (1번을 최후통첩으로 남겨놓았다)
2번방법은 동작하였다.
아직도 해결되지 않은 의문점이 있는데..
서버를 껐다 키면 또 프로시저 내부에서 묵시적 형 변환이 일어나지 않는다..
처음엔 30분정도 있다가부터 에러가 났고,
그 다음에 2번 해결과정의
gpt가 말해준 1번 방법(명확하게 string형태로 바인딩하기) 으로
인자를 바인딩할때 String()으로 형태를 지정해서 넘겨눴다니 4시간 이후부터 에러가 나기 시작했다.
그래서 문제를 해결할때 진짜 해결이 된건지 테스트하기가 정말.. 어려웠다...
소스코드 하나만 바꿔서 테스트할라해도 몇시간을 기다려야하니..
정말 왜 그런거지..?
gpt에 물어보면 세션을 날려보던지 해봐라 그러던데.. 음..