IP 주소 저장


25

등록 된 모든 사용자의 IP 주소를 데이터베이스에 저장해야합니다. 그런 열에 대해 몇 문자를 선언해야하는지 궁금합니다.

IPv6도 지원해야합니까? 그렇다면 IP 주소의 최대 길이는 얼마입니까?

답변:


27

문자열로 저장하지 마십시오. 사용하여 int unsigned열 및 저장소를 /로 검색 INET_ATON()하고 INET_NTOA()각각. AFAIK mysql은 ipv6에 대해 INET_ *를 지원하지 않습니다.

의견에 따라 편집

내장 함수를 사용하여 IP를 정수로 변환하거나 정수를 데이터베이스에 저장하면 해당 IP를 자동으로 검증하는 부작용이 있습니다. IP를 VARCHAR (16)로 저장한다고 가정하면 일부 사용자 지정 유효성 검사와 함께 잘못된 IP (예 : 999.999.999.999)를 저장하지 않아야합니다. INET_ * 함수가이를 처리합니다.


1
-1, IP 주소는 최대 128 비트이며 MySQL에서 지원하는 가장 큰 정수 유형은 64 비트입니다.
Hendrik Brummermann

3
IPv4 는 32 비트입니다. 128 비트는 IPv6 용이며, 언급했듯이 INET_ *는 지원하지 않습니다.
Richard

1
IPv6 주소의 경우 INET6_ATON () 및 INET6_NTOA () 함수를 사용하십시오 (예 : rathishkumar.in/2017/08/how-to-store-ip-address-in-mysql.html
rathishDBA

6

IPv6을 고려할 때가되었을 것입니다. MySQL에는 IPv6 주소를 이진 형식으로 변환하는 방법이 없습니다. 40 개의 문자열은 모든 일반 IPv6 주소를 처리합니다. 40자를 초과 할 수있는 형식이 있으므로 실제로는 발생하지 않을 것으로 생각됩니다.

그때부터 7 개의 구분 문자를 가진 최대 8 개의 4 개의 문자 그룹이 있다는 정보로부터 크기를 계산할 수 있습니다. 비정상 형식은 마지막 두 그룹을 IPv4 형식 주소로 바꿉니다. 주소 압축이 없으면 마지막 9자를 최대 15 자로 바꿉니다.

블록을 저장하는 경우 블록 크기 표시는 IPv4에 필요한 3 자 대신 4자를 사용할 수 있습니다.

당신이 얻는 형식은 일관성이 있어야하지만 내가 본 모든 소프트웨어는 주소에 일관된 형식을 제공합니다.


2
IPv6가 다가오고 Y2K와 같이 기다리는 것보다 준비하는 것이 낫다는 것에 전적으로 동의합니다. :
Jeff

올뿐만 아니라 이미 내 시스템에 있습니다.
BillThor

6

PostgreSQL로 마이그레이션하고 INET 또는 CIDR 데이터 유형을 사용하는 것이 좋습니다 .

CREATE TABLE test ( test_id serial PRIMARY KEY, address inet );
INSERT INTO test ( address ) VALUES ( '1.2.3.4'::inet );
INSERT INTO test ( address ) VALUES ( 'a:b::c:d'::inet );
SELECT * FROM test;
 test_id | address  
---------+----------
       1 | 1.2.3.4
       2 | a:b::c:d

네트워크에있는 IP를 가져 오려면 SELECT * FROM test WHERE address << '1.2.3.0/24'::inet;
jkj

4

다음은 MySQL 메일 링리스트 중 하나에 대한 최상의 답변입니다. 읽기 최저 Fieldtype는 IP 주소를 저장하는 ... .

간단히 말해서 INT (10) UNSIGNED를 사용하는 것이 좋습니다.

  1. 적은 메모리를 사용합니다 (4 바이트 만 해당)
  2. 특히 방문자의 원산지를 찾는 경우 IP 범위를 정렬하고 검색하는 데 가장 적합합니다.

따라서 192.168.10.50을 사용하십시오.

(192 * 2 ^ 24) + (168 * 2 ^ 16) + (10 * 2 ^ 8) + 50 = 3232238130 (192.168.10.50 결과)

MySQL의에서 직접 사용할 수 있습니다 SELECT INET_ATON('192.168.10.50'); 얻을 3232238130.

또는

192 + (168 * 2 ^ 8) + (10 * 2 ^ 16) + (50 * 2 ^ 24) = 839559360 (뒤로, 결과는 50.10.168.192)

MySQL에서는 직접 사용 SELECT INET_NTOA(3232238130); 하여 192.168.10.50돌아올 수 있습니다 .


인상적, +1 당신을 위해 !!! 부호없는 4 바이트를 사용하면 문자열 조작이 언젠가 이길 수 있습니다.
RolandoMySQLDBA

-1, IP 주소는 최대 128 비트이며 MySQL에서 지원하는 가장 큰 정수 유형은 64 비트입니다.
Hendrik Brummermann

3
nhnb는 IPv6은 128 비트이지만, 대화의 IPv4 관한 IS 32 비트. 귀하의 지식을 주장하는 각 의견 / 답변에 대해 언급 할 필요가 없습니다.

귀하의 답변은 이전 인터넷 프로토콜 만 다루고 있지만 질문은 IPv6를 명시 적으로 언급합니다. 마지막 시장 인터넷 제공 업체 (적어도 우리 나라에서는)가 올해 말 전에 IPv6을 지원할 것이므로이를 처리 할 수없는 데이터베이스 구조를 설계하는 것은 매우 나쁜 생각입니다.
Hendrik Brummermann


1

최대 15 개의 문자를 저장할 수 있습니다. VARCHAR (15)는 16 바이트이므로 사용하지 마십시오 (첫 번째 바이트는 문자열 길이를 관리하므로 검색 및 저장이 느려집니다). IP 주소와 같은 곳에 항상 CHAR (15)를 사용하십시오.


IP 주소의 최대 길이는 45 자입니다.
Hendrik Brummermann

CHAR은 공백으로 채우지 않습니까?
Gaius

0

답변에 댓글을 달 수 없습니다. stackoverflow 에 관한 질문 이 있습니다 . 그리고 나는 선택된 대답에 전적으로 동의합니다 : 2xBIGINT를 사용하는 것이 아마도 ipv6에 가장 적합한 방법 일 것입니다.

나는 2 * BIGINT를 제안하지만 그들이 서명되지 않았는지 확인하십시오. IPv6의 / 64 주소 경계에는 일종의 자연스러운 분할이 있습니다 (/ 64는 가장 작은 넷 블록 크기이므로).

이 bigint에 ipv4를 저장할 수도 있습니다. 그 중 하나를 NULL로 표시하거나 V4COMPAT 형식을 사용하여

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.