2012-05-14 29 views
6

Ok, bây giờ tôi biết rằng các câu hỏi tương tự có thể đã được hỏi một triệu lần nhưng tôi là một người mới thực sự ở đây và tôi thực sự đánh giá cao sự giúp đỡ của bạn ở đây.Lưu trữ địa chỉ IP trong cơ sở dữ liệu MySQL (IPv4 và IPv6)

Về cơ bản, tôi muốn lưu trữ địa chỉ IP của khách truy cập trong một MySQL để truy xuất và xác minh sau này. Trước tiên, tôi cần phải biết loại trường nào tôi cần sử dụng để lưu trữ địa chỉ IP. Tôi cũng muốn làm cho hệ thống tương thích với các địa chỉ IPv6 nếu có thể.

Cảm ơn trước

+1

Trường hợp sử dụng chính của bạn cho địa chỉ là gì? Bạn sẽ truy vấn chúng? Chia chúng ra và truy vấn theo một số quy tắc subnetting? Hay chúng được lưu trữ chỉ để hiển thị? –

+2

Hãy thử cách này: http://stackoverflow.com/questions/2049681/store-ipv6-in-database – Mark

+0

Vâng để có liên kết xác nhận. Tôi muốn đảm bảo rằng liên kết xác nhận được truy cập từ cùng một địa chỉ IP được tạo. Vì vậy, tôi sẽ truy vấn chúng] – Andy

Trả lời

9

Để lưu trữ một IPv4 bạn có thể sử dụng một INT UNSIGNED , trong khi đối với một IPv6 bạn cần một decimal(39,0), để lưu trữ một ip trong bảng, bạn có thể sử dụng chức năng INET_ATON:

INSERT INTO table (ipcol) VALUES (INET_ATON('192.168.0.10')); 

và lấy nó trở lại với chức năng INET_NTOA:

SELECT INET_NTOA(ipcol) AS ip FROM table; 

Câu trả lời này tồn tại trước khi hỗ trợ MySQL IPv6; người dùng nên được biết rằng MySQL hiện hỗ trợ IPv6:https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html

+0

Cảm ơn nhưng tôi nghĩ rằng tôi chỉ đọc rằng 'INET_ATON()' không hỗ trợ IPv6. Và ngay cả khi nó đã làm, làm thế nào để tôi nhận được địa chỉ IPv6 bằng cách sử dụng PHP? – Andy

+0

Hãy thử với inet_pton: http://php.net/manual/en/function.inet-pton.php – aleroot

+0

Đủ công bằng, cảm ơn. Bây giờ, làm cách nào để tôi tìm kiếm địa chỉ IP của người dùng trong PHP? – Andy

1

Không có loại không thể thiếu trong MySQL đủ lớn để lưu trữ một địa chỉ IPv6. Cách nhỏ gọn nhất để lưu trữ nó giống như một cái gì đó như BINARY(16). Nếu bạn chỉ cần lưu trữ và truy xuất địa chỉ và bạn không cần phải thực hiện các thao tác logic trên chúng (ví dụ: hoạt động của netmask để truy vấn địa chỉ IP nào nằm dưới tiền tố bao phủ) thì điều đó sẽ là đủ. Nếu bạn cần thực hiện các thao tác lô-gic hoặc bit, bạn sẽ cần phải fancier: bạn sẽ cần phải lưu trữ các địa chỉ IPv6 trong hai cột số nguyên 64 bit riêng biệt.

+0

Không, tôi không cần phải làm bất cứ điều gì ưa thích hơn (chỉ cần lấy/so sánh chúng trong một truy vấn). Vì vậy, tất cả tôi cần biết bây giờ là làm thế nào tôi có thể có được địa chỉ IP của người dùng bằng cách sử dụng PHP? – Andy

4

tôi sử dụng VARBINARY (16) cho các kiểu dữ liệu và sử dụng các chức năng MySQL INET_ATON() để chèn số IP (mà sau này tôi đọc bằng cách sử dụng chức năng đảo ngược, INET_NTOA().

+0

Vì vậy, VARBINARY (16) có hỗ trợ cả IPv4 và IPv6 không? Và làm cách nào để tìm địa chỉ IP của khách truy cập bằng PHP? – Andy

+1

Bạn phải sử dụng INET6_NTOA và INTE6_ATON, nhưng điều này không có sẵn trong MySQL cho đến phiên bản 5.6.3 –

Các vấn đề liên quan