MySQL에서 BINARY 비교
PHP에서 DB에 IP를 저장해야할 일이 있었습니다.
여기 저기 찾아보니, php의 inet_pton을 이용하여 IP를 BINARY 형태로 바꾼 후 저장하는 것이 좋다고 하더군요.
그래서 BINARY 형의 열을 만들고, 다음의 질의문을 이용해 IP를 저장했습니다.
"INSERT INTO log (ip, ins_date) VALUES ( ... 생략 ...)"
그리고 같은 IP를 가지는 행이 몇 개나 있는지 알아보기 위해 "SELECT count(*) FROM log WHERE ip = '... 생략 ...'"를 실행했는데, 분명히 값이 해당되는 행이 있는데도 불구하고 결과가 계속 0으로 나왔습니다.
알고 봤더니, BINARY 형은 삽입된 데이터가 자료형의 크기 보다 작은 경우, 데이터 뒤에 '\0'(null 문자)를 자동으로 추가하는데, 비교할 때는 '\0'가 있는 것과 없는 것이 다른 것으로 처리되어서 발생한 문제였습니다.
예를 들어 설명하면,
log 테이블에 BINARY(16)인 ip 열이 있는데, 여기에 "abc"라는 값을 삽입하면, 실제로는 "abc\0\0\0 ..생략.. \0" 이런 값이 들어가게 되고, 만약 ip = "abc"라는 조건으로 검색을 하면, 뒤에 붙어 있는 '\0'들 때문에 제대로 검색이 되지 않습니다.
해결법은 간단합니다. BINARY 대신에 VARBINARY 형을 사용하시면 됩니다.
참고:
http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=21689&cat1=11&cat2=334&cat3=347&lang=k
여기 저기 찾아보니, php의 inet_pton을 이용하여 IP를 BINARY 형태로 바꾼 후 저장하는 것이 좋다고 하더군요.
그래서 BINARY 형의 열을 만들고, 다음의 질의문을 이용해 IP를 저장했습니다.
"INSERT INTO log (ip, ins_date) VALUES ( ... 생략 ...)"
그리고 같은 IP를 가지는 행이 몇 개나 있는지 알아보기 위해 "SELECT count(*) FROM log WHERE ip = '... 생략 ...'"를 실행했는데, 분명히 값이 해당되는 행이 있는데도 불구하고 결과가 계속 0으로 나왔습니다.
알고 봤더니, BINARY 형은 삽입된 데이터가 자료형의 크기 보다 작은 경우, 데이터 뒤에 '\0'(null 문자)를 자동으로 추가하는데, 비교할 때는 '\0'가 있는 것과 없는 것이 다른 것으로 처리되어서 발생한 문제였습니다.
예를 들어 설명하면,
log 테이블에 BINARY(16)인 ip 열이 있는데, 여기에 "abc"라는 값을 삽입하면, 실제로는 "abc\0\0\0 ..생략.. \0" 이런 값이 들어가게 되고, 만약 ip = "abc"라는 조건으로 검색을 하면, 뒤에 붙어 있는 '\0'들 때문에 제대로 검색이 되지 않습니다.
해결법은 간단합니다. BINARY 대신에 VARBINARY 형을 사용하시면 됩니다.
참고:
http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=21689&cat1=11&cat2=334&cat3=347&lang=k
댓글
댓글 쓰기