正如「ipv6-capable inet_aton and inet_ntoa functions needed」中所要求的那樣,目前沒有用於存儲IPv6地址的MySQL功能。推薦的數據類型/功能用於存儲/插入是什麼? (我不打算把它們存儲爲一個字符串)。我也不想將IPv6地址分成2個INT。在MySQL中存儲IPv6地址
回答
如何:
BINARY(16)
這應該是足夠有效的。
正如該錯誤報告中指出的那樣,目前沒有將MySQL中的文本IPv6地址從/轉換爲二進制文件的功能。您可能需要在應用程序中執行此操作,或者可能在MySQL服務器中創建UDF(用戶定義的函數)來執行此操作。
UPDATE:
的MySQL 5.6.3具有支持IPv6地址,請參閱以下內容: 「INET6_ATON(expr)」。
正如我之前的建議,數據類型爲VARBINARY(16)
而不是BINARY(16)
。唯一的原因是MySQL函數可以同時用於IPv6和IPv4地址。 BINARY(16)
適用於僅存儲IPv6地址並保存一個字節。處理IPv6和IPv4地址時應使用VARBINARY(16)
。
舊版本的MySQL和MariaDB的實現參見以下內容:「EXTENDING MYSQL 5 WITH IPV6 FUNCTIONS」。
沒有人發佈了一個完整的工作答案(和大量的實例使用Windows ::1
它可以是非常誤導直播(或「生產」)的環境中)的任何地方(至少我能找到),所以在這裏是:
- 要存儲的格式。
- 示例
INSERT
使用合理複雜的IPv6 IP地址進行查詢。 - 示例
SELECT
查詢您將能夠將IP地址echo
返回給客戶端。 - 疑難解答,以確保您沒有遺漏任何遺留代碼。
我改變了所有的列名ipv6
,以反映他們正確支持IPv6的(和可以讓你保持舊列ip
完好)。可以將ip
列存儲在ipv6
列中,然後只要確定轉換已經工作,只需要滴入ip
列;當我真的有時間時,我會將其添加到這篇文章中。
IPv6的數據類型
正如已經提到VARBINARY 16
是去,直到AMD祝福我們有128個CPU和數據庫進行更新,以支持128個整數的可取之道(我這麼說的是否正確?) 。 IPv6是128位,而不是64位。
CREATE TABLE `example`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`ipv6` VARBINARY(16) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_unicode_520_ci'
ENGINE=InnoDB;
IPv6的INSERT查詢
很明顯,我們需要存儲一個IPv6的IP地址纔可以SELECT
它;這裏是PHP/SQL代碼:
$ipv6 = mysqli_real_escape_string($db,'FE80:0000:0000:0000:0202:B3FF:FE1E:8329');
$query1 = "INSERT INTO example (ipv6) VALUES (INET6_ATON('$ipv6'));";
IPv6的SELECT查詢
的PHP/SQL代碼:
$ipv6 = mysqli_real_escape_string($db,'FE80:0000:0000:0000:0202:B3FF:FE1E:8329');
$query2 = "SELECT INET6_NTOA(ipv6) AS ipv6 FROM example WHERE ipv6=INET6_ATON('$ipv6');";
這將返回fe80::202:b3ff:fe1e:8329
;不,不是完整的IPv6(即FE80:0000:0000:0000:0202:B3FF:FE1E:8329
),它是一個精簡/簡寫版本。有代碼使其成爲正式的全長版本,但這是爲了節省我自己和其他人的時間,因爲這個問題是一直在提升。
重要:只是因爲一些 IPv6地址看起來像他們會適合於bigint
不不意味着兩分鐘後,用更大的IPv6地址的人就不會停止,並造成嚴重破壞。
希望這可以節省一些人打開另外二十個標籤的精神錯亂。當我有將來的時間時,我會添加額外的PHP代碼,將濃縮的IPv6擴展到完整的正式格式。
故障排除
如果由於某些原因存儲和/或獲取IPv6地址,工作不適合你,然後抓住自己的Advanced Find and Replace複印件(在葡萄酒比Linux的原生grep
工作更快);主要使用查找,而不是替換。確保您的軟件中的代碼是一致的。
- 所有
$ip
變量必須轉換爲$ipv6
,所以你知道你已經有了位覆蓋。 - 不要忘記刪除結束
)
爲下面四個步驟: - 搜索的PHP
inet_pton(
功能的所有實例並刪除它們。 - 搜索PHP
inet_ntop(
的所有實例並刪除它們。 - 搜索的所有實例SQL
INET_ATON(
函數並將其刪除。 - 搜索的所有實例SQL
INET_NTOA(
函數並將其刪除。 - 搜索
$ipv6
的所有實例,並確保所有IP-IN-TO-SQL實例使用INET6_ATON('$ipv6')
以及IP-FROM-SQL使用INET6_NTOA(ipv6) AS ipv6
的所有實例。 - 搜索
$row1['ip']
的所有實例並將其替換爲$row1['ipv6']
。 - 確保
$ipv6 =
的所有實例都使用以下代碼(數據庫對象引用已更改):$ipv6 = (isset($_SERVER['REMOTE_ADDR']) && strlen($_SERVER['REMOTE_ADDR']) > 0) ? mysqli_real_escape_string($db,$_SERVER['REMOTE_ADDR']) : mysqli_real_escape_string($db,getenv('REMOTE_ADDR'));
。 - 確保您的測試使用新鮮測試,如果你知道有什麼不對勁你開始調試之前的IP地址可能拙劣的版本代替。
- 1. 在MySQL數據庫(IPv4和IPv6)中存儲IP地址
- 2. mysql存儲具有外鍵約束的ipv6地址
- 3. 將IPv4和IPv6地址存儲在單個列中
- 4. 如何IPV6地址在SQL
- 5. 代表IPv6地址
- 6. sockaddr和IPv6地址
- 7. IPv6地址範圍
- 8. 解析IPv6地址
- 9. C:存儲和讀取的IPv4/IPv6地址和端口
- 10. 在PHP中檢測IPv6地址並將其正確存儲在MySQL中。怎麼樣?
- 11. Linux IPV6主地址和副地址
- 12. 如何在關係數據庫中存儲與IPv6兼容的地址
- 13. 從PHP Ipv6 CIDR獲取IPv6地址數
- 14. 在linux中識別ipv6地址
- 15. 在shell和PowerShell中縮短IPV6地址
- 16. 如何將getaddrinfo中的IPv6地址存儲到字符數組中?
- 17. Mongoid:IPv6地址存儲
- 18. IPv6地址到域名
- 19. 定期對IPv6地址
- 20. 從url解析ipv6地址
- 21. 生成隨機IPv6地址
- 22. 從inet_pton解包IPv6地址
- 23. IPv6地址獲取功能?
- 24. gethostbyname替換爲IPv6地址
- 25. Python的IPv6字節地址
- 26. Java getLocalAddr()返回IPV6地址
- 27. Amazon EC2公共ipv6地址
- 28. SNMP ping支持IPv6地址
- 29. SNMP陷阱到IPv6地址
- 30. Cloudflare Header返回IPV6地址
[數據庫中存儲IPv6]的可能重複(http://stackoverflow.com/questions/2049681/store-ipv6-in-database) – knittl