답변:
문자열로 저장하지 마십시오. 사용하여 int unsigned
열 및 저장소를 /로 검색 INET_ATON()
하고 INET_NTOA()
각각. AFAIK mysql은 ipv6에 대해 INET_ *를 지원하지 않습니다.
의견에 따라 편집
내장 함수를 사용하여 IP를 정수로 변환하거나 정수를 데이터베이스에 저장하면 해당 IP를 자동으로 검증하는 부작용이 있습니다. IP를 VARCHAR (16)로 저장한다고 가정하면 일부 사용자 지정 유효성 검사와 함께 잘못된 IP (예 : 999.999.999.999)를 저장하지 않아야합니다. INET_ * 함수가이를 처리합니다.
IPv6을 고려할 때가되었을 것입니다. MySQL에는 IPv6 주소를 이진 형식으로 변환하는 방법이 없습니다. 40 개의 문자열은 모든 일반 IPv6 주소를 처리합니다. 40자를 초과 할 수있는 형식이 있으므로 실제로는 발생하지 않을 것으로 생각됩니다.
그때부터 7 개의 구분 문자를 가진 최대 8 개의 4 개의 문자 그룹이 있다는 정보로부터 크기를 계산할 수 있습니다. 비정상 형식은 마지막 두 그룹을 IPv4 형식 주소로 바꿉니다. 주소 압축이 없으면 마지막 9자를 최대 15 자로 바꿉니다.
블록을 저장하는 경우 블록 크기 표시는 IPv4에 필요한 3 자 대신 4자를 사용할 수 있습니다.
당신이 얻는 형식은 일관성이 있어야하지만 내가 본 모든 소프트웨어는 주소에 일관된 형식을 제공합니다.
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
다음은 MySQL 메일 링리스트 중 하나에 대한 최상의 답변입니다. 읽기 최저 Fieldtype는 IP 주소를 저장하는 ... .
간단히 말해서 INT (10) UNSIGNED를 사용하는 것이 좋습니다.
따라서 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
돌아올 수 있습니다 .
MySQL v5.6.3부터 그들은 IPv4 및 IPv6 주소를 지원 INET6_ATON
하고 지원할 INET6_NOTA
것입니다. 그러나 더 이상 정수로 저장하지 않습니다. IPv6은 a를 반환 varbinary(16)
하고 IPv4는 a를 반환합니다 varbinary(4)
.
http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton
최대 15 개의 문자를 저장할 수 있습니다. VARCHAR (15)는 16 바이트이므로 사용하지 마십시오 (첫 번째 바이트는 문자열 길이를 관리하므로 검색 및 저장이 느려집니다). IP 주소와 같은 곳에 항상 CHAR (15)를 사용하십시오.
답변에 댓글을 달 수 없습니다. stackoverflow 에 관한 질문 이 있습니다 . 그리고 나는 선택된 대답에 전적으로 동의합니다 : 2xBIGINT를 사용하는 것이 아마도 ipv6에 가장 적합한 방법 일 것입니다.
나는 2 * BIGINT를 제안하지만 그들이 서명되지 않았는지 확인하십시오. IPv6의 / 64 주소 경계에는 일종의 자연스러운 분할이 있습니다 (/ 64는 가장 작은 넷 블록 크기이므로).
이 bigint에 ipv4를 저장할 수도 있습니다. 그 중 하나를 NULL로 표시하거나 V4COMPAT 형식을 사용하여