1. 범위 검색
- 애초에 이런 쿼리로 만들어서 하는방법이 있다.
BETWEEN TO_NUMBER('20014430000000000000000000000000', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
and
TO_NUMBER('20014430ffffffffffffffffffffffff', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
- 이 범위가 부담되면, 64진수로 바꿔쓰면 줄어들기야 하겠지만, 어차피 ipv6 범위검색을 많이 하지는 않으니까 크게 의미는 없는듯.
2. 마스크 검색
- 이게 좀 까다롭다. 2001:4430::/32 를 예로 들면, 저기 앞에있는 숫자 하나가 4byte 라서,
확장주소로 변환해봤자 2001:4430:000000000000000000000000 즉 32자리기 때문에 /128 마스크를 감당할수없다.
방법이 있다며 2진수로 128비트까지 확장시켜야하고, 그 상태에서 BETWEEN 검색을....
일단, 내가 찾은 방법은 그런방법은 아니다.
문제가 되는 부분은 /32 같이 4의 배수로 떨어지는게 문제가 아니라, /33, /34, /35 같은 4로 떨어지지 않는게 문제인것이다.
/33을 예시로 들어보면,
STEP 1. 마스크를 4로 나눈 나머지값 계산
-> 33%4 = 3
어차피 결과는 4의 배수면 범위계산이 쉽게 때문에 의미가 없고, 1,2,3 3개의 경우의 수만 생각하면 된다.
그리고 16진수 기반의 IPv6 주소의 한자리가 4비트이므로, 위의 경우의 수에 대입하면 아래와 같은 결과가 나온다
1 : 1000
2 : 1100
3 : 1110
4 : 1111 < 4의 배수이므로 의미가없음
즉, 하나의 문자가 4bit 이므로 1000의 경우의 수는
1000 = 8(0x8)
1100 = 12(0xC)
1110 = 14(0xE) 가 되고,
/33의 의 4 나머지는 1이므로 8 이고, 그러므로 범위는 아래와 같다.
2001:4430:800000000000000000000000 ~
2001:4430:fffffffffffffffffffffffff
만약 /34였다면?
- 4의 배수가 아니라서, 마찬가지로 계산 -> 1100 (0xC) 이므로 범위는 아래와같음
2001:4430:C00000000000000000000000 ~
2001:4430:fffffffffffffffffffffffff