通常,在保存IPv4地址时,一个IPv4最小需要7个字符,最大需要15个字符,所以,使用VARCHAR(15)即可。MySQL在保存变长的字符串时,还需要额外的一个字节来保存此字符串的长度。而如果使用无符号整数来存储,只需要4个字节即可。另外还可以使用4个字段分别存储IPv4中的各部分,但是通常这不管是存储空间和查询效率应该都不是很高(可能有的场景适合使用这种方式存储)。
使用无符号整数来存储也有缺点:
- 不便于阅读
- 需要手动转换
public static void main(String[] args) {
// 将字符串ip装换为long select inet_aton('192.168.0.125');
String ipStr = "192.168.0.125";
String[] ip = ipStr.split("\\.");
long ipLong = (Long.valueOf(ip[0]) << 24) + (Long.valueOf(ip[1]) << 16)
+ (Long.valueOf(ip[2]) << 8) + Long.valueOf(ip[3]);
System.out.println("ipL = " + ipLong);
// 将ip的lang值装换为字符串 select inet_ntoa(3232235645);
long ipL = 3232235645L;
StringBuilder ipS = new StringBuilder();
ipS.append(ipLong >>> 24).append(".");
ipS.append((ipLong >>> 16) & 0xFF).append(".");
ipS.append((ipLong >>> 8) & 0xFF).append(".");
ipS.append(ipLong & 0xFF);
String s = ipS.toString();
System.out.println("s = " + s);
}