我正在更改一些表以将IP地址存储为数字而不是字符串.这对于IPv4来说很简单,其中32位地址可以适合整数列.但是,IPv6地址是128位.
的MySQL文档仅示出了数字类型多达64个比特("BIGINT").
我应该坚持使用char/varchar进行IPv6吗?(理想情况下,我想对IPv4和IPv6使用相同的列,所以我不想这样做).
有没有比使用两个bigint列更好的东西?每当使用地址时,我宁愿不必将值分解为上限和下限/ 64.
我正在使用MariaDB 5.1 - 如果在更高版本的MySQL中有更好的解决方案,那么很高兴知道,虽然没有立即帮助.
[编辑]请注意,我建议采用最佳方式执行此操作 - 很明显,有多种方法可以做到这一点(包括现有的字符串表示),但是(在性能方面)最好?(即如果某人已经完成了分析,这将使我无法做到这一点,或者如果我遗漏了一些明显的东西,那么知道也很好).
我怎么做?
现在,IPv6将不会被使用,但我需要设计应用程序以使其为IPv6做好准备.有必要在MySQL数据库中存储IP地址和CIDR块(也是BGP NLRI,但这是另一个故事).我总是使用INT for IPv4 +一个TINYINT用于masklen,但IPv6是128位.
最适合的方法是什么?2xBIGINT?CHAR(16)用于二进制存储?CHAR(39)用于文本存储?8xSMALLINT在专门的桌子?
你会推荐什么?
在MySQL数据库中用PHP存储IP的最佳实践是什么?有一个名为ip2long的函数 - 但这仅适用于IPv4.但是IPv6呢?
我知道一个用于IPv6 IP的PHP函数,但它在使用PHP <Version 5.3的Windows上不起作用
IP 地址是使用 PHP 脚本中的 inet_pton() 存储的。它们存储在数据库的 varbinary(16) 字段中。但是我现在需要查询并返回仅使用 MySQL 存储的 IP 地址,但这似乎有点任务!
我试过使用 MySQL 的 INET_NTOA() 但由于某种原因它只返回 0.0.0.0。谁有想法?