2011-01-04 42 views
10

Tôi sẽ sử dụng varchar(20), nhưng tôi đã tự hỏi điều gì sẽ xảy ra nếu tôi nên thực hiện INT và loại bỏ các giai đoạn thay thế. Điều gì sẽ tốt hơn và tại sao?Tôi nên lưu trữ địa chỉ IP cho MySQL?

+0

Tùy thuộc vào những hoạt động nào bạn sẽ thực hiện trên dữ liệu. – zerkms

+3

Bạn không thể bỏ qua các khoảng thời gian hoặc bạn sẽ phải pad mỗi octet với zeroes vì ​​vậy họ là tất cả 3 ký tự dài. Nếu không, IP 192.168.45.5 và 192.168.4.55 của IP sẽ giống nhau. Khi mọi người đề nghị sử dụng một int (32 bit) họ có nghĩa là bạn mất mỗi octet (8 bit mỗi) và đóng gói chúng lại với nhau thành một int duy nhất. –

Trả lời

16

Tôi đoán bạn chỉ quan tâm đến địa chỉ IPv4 chứ không phải IPv6.

Tôi sẽ sử dụng INT UNSIGNED cho cột và sau đó sử dụng INET_ATONINET_NTOA để chuyển đổi qua lại giữa biểu diễn văn bản và giá trị int.

mysql> SELECT INET_ATON('192.168.10.50'); 
+----------------------------+ 
| INET_ATON('192.168.10.50') | 
+----------------------------+ 
|     3232238130 | 
+----------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT INET_NTOA(3232238130); 
+-----------------------+ 
| INET_NTOA(3232238130) | 
+-----------------------+ 
| 192.168.10.50   | 
+-----------------------+ 
1 row in set (0.00 sec) 
0

Nếu bạn thực sự quan tâm đến tiết kiệm không gian, bạn có thể đóng gói nó thành một int 4 byte. Mỗi khối địa chỉ IP IPv4 có thể có 256 giá trị có thể, mà chỉ xảy ra là phạm vi của một byte đơn.

- Edit -> Những gì tôi vừa mô tả có thể được thực hiện với sự f00 chức năng mysql liên kết trong câu trả lời của ông

Tuy nhiên, lưu trữ nó như là một chuỗi sẽ tiết kiệm được một chút thời gian mã hóa. Thành thật mà nói, trừ khi bạn đang làm điều này trên một quy mô rất lớn, việc tối ưu hóa từ một định dạng lưu trữ dày đặc hơn sẽ không thành vấn đề.

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