# MariaDB 性能优化 - 把IP地址存成 UNSIGNED INT

**URL:** <https://www.isharkfly.com/t/mariadb-ip-unsigned-int/8038>\
**Category:** 数据库\
**Created:** [April 3, 2014, 1:47pm UTC](https://www.isharkfly.com/t/mariadb-ip-unsigned-int/8038 "2014-04-03T13:47:45Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [April 3, 2014, 1:47pm UTC](https://www.isharkfly.com/t/mariadb-ip-unsigned-int/8038/1 "2014-04-03T13:47:45Z")

</div>

很多程序员都会创建一个 VARCHAR(15) 字段来存放字符串形式的IP而不是整形的IP。如果你用整形来存放，只需要4个字节，并且你可以有定长的字段。而且，这会为你带来查询上的优势，尤其是当你需要使用这样的WHERE条件：IP between ip1 and ip2。

我们必需要使用UNSIGNED INT，因为 IP地址会使用整个32位的无符号整形。

而你的查询，你可以使用 INET\_ATON() 来把一个字符串IP转成一个整形，并使用 INET\_NTOA() 把一个整形转成一个字符串IP。在PHP中，也有这样的函数 ip2long() 和 long2ip()。`$r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";
`
