요즘에는 ORM을 많이 사용하는곳이 많겠지만, 쿼리문을 직접 사용 하는곳도 있을겁니다.
보통 쿼리문을 아래와 같이 파라미터 바인딩을 사용하여, 값을 넣게 되는데,
execute('SELECT * FROM t WHERE data = ?', (data))
이는 rdbms에서 숫자형이면 숫자로, 문자형이면 문자형으로 변환을 해주는데, 위 쿼리문은 아래와 같이 변환 됩니다.
SELECT * FROM t WHERE data = 'data'
그런데, 옵티마이저에서 제공하는 라이브러리 캐시 기능등은 사용 할 수 없지만,
테스트 환경이나, 넣어야 하는 컬럼수가 많아지는경우 유지보수에 비용이 많이들고 떨어지기 때문에 직접 넣는 경우도 있습니다.
제가 그런 상황에서 실수로 쿼리문을 아래와 같이 작성 하였다가 심각한 문제를 발견하게 되었습니다.
`SELECT * FROM t WHERE data = '${data}'`;
위 쿼리문에 대한 결과 입니다.
결과를 보니 0000000003, 03, 3 이 모두 출력 되었습니다 where절에 3으로 조회 했는데 이상하죠?
이유는 DB 조회시에, 앞뒤 공백은 제거하고 검색을 하게 되는데, 가장 앞자리에 0이 접두사로 입력되면 공백으로 처리되는걸로 유추됩니다.
다들 이 부분을 조심하시는게 좋아 보입니다.
감사합니다.