programing

데이터베이스에 IP를 저장하는 가장 좋은 방법?

bestcode 2022. 9. 19. 23:46
반응형

데이터베이스에 IP를 저장하는 가장 좋은 방법?

MySQL 데이터베이스에 IP 주소를 저장하는 데 가장 적합한 필드 유형과 길이는 무엇입니까?

IPv6 의 경우는 어떻습니까.

IP를 로서 보존합니다.INT(11) UNSIGNED다음으로 및 함수를 사용하여 IP 주소를 저장/삭제합니다.

샘플 코드:

INSERT table(ip) VALUES (INET_ATON('192.168.0.1')); /*ip = 3232235521*/
SELECT INET_NTOA(ip) As IPAddress FROM table; /*IPAddress = 192.168.0.1*/

사용하는 방법에 따라 다르지만 가장 간단한 방법은 문자열로 표현하는 것입니다.그리고질문은 그것을 처리하는데 몇 글자가 필요한지 입니다(45글자).

IPv6 와 IPv4 를 모두 서포트하는 경우는, 다음과 같이 보존합니다.BINARY(16)IP 주소를 데이터베이스에 삽입하기 전에 변환합니다.예를 들어, PHP(MySQL에서 일반적으로 사용되는 langugage)에서는 이 작업을 함수로 수행할 수 있습니다.

IPv6 주소는 128비트(16바이트)이기 때문에, 그것을 격납하기에 충분한 필드가 필요합니다.또, IP 가 IPv4인지 IPv6 인지를 나타내는 필드가 필요한 경우도 있습니다(IPv6 의:192.168.4.10 은, IPv4 의 192.168.4.10 와 수치적으로는 같으나, 사용의 애플리케이션에 따라서는, 2 개의 구별이 필요하게 되는 경우가 있습니다).

서브넷을 저장할 필요가 있는 경우 서브넷의 첫 번째 주소, CIDR 마스크 및 계산된 상위 주소(브로드캐스트주소)를 저장할 수 있습니다.이렇게 하면 검색에 도움이 되므로 다음과 같은 쿼리를 수행할 수 있습니다.

SELECT * FROM networks WHERE lowerBound<=MYIP AND upperBound>=MYIP

서브넷을 사용하고 있는 경우는, 유저의 올바른 처리(의사 코드)에 의존하지 않고, 스스로 하한치를 계산해 주세요.

lowerBound = AND(networkAddress, subnetMask)
upperBound = OR(lowerBound, complement(subnetMask))

이것은, IPv4 와 IPv6 의 양쪽 모두에 적용됩니다.

IP 주소로 데이터베이스를 검색할 예정이라면 INT를 쿼리하는 것이 훨씬 빠릅니다.예를 들어 로그 출력에 표시하기 위해 저장하는 경우 앞뒤로 변환할 필요가 없으므로 문자열이 더 좋습니다.

Scrum Meister의 의견에 전적으로 동의합니다. 가장 좋은 방법은,INT(11) UNSIGNEDINET 함수에 스토리지/검색 기능을 포함하지만 서브넷에 의해 쿼리되지 않는 경우VARCHAR(45)

언급URL : https://stackoverflow.com/questions/4982701/best-way-to-store-ip-in-database

반응형