Chinaunix

标题: 紧急求助:点段式IP转为有符号整数存储 [打印本页]

作者: vinhlam    时间: 2009-02-23 10:10
标题: 紧急求助:点段式IP转为有符号整数存储
MySQL版本:5.1.30
GUI工具:Navicat for MySQL 8.0.29
table name:client
column name:IP(点段式的四节IP)
现在我有两个需求:
一、使用INET_ATON函数将四节点段式IP转为有符号整数或无符号整数存储
二、不用存储,但在建立的视图中使用INET_ATON函数将IP转换成整数,但它转换后的值是无符号整数,也就是值的范围0到4294967295,
这本来是挺好的,但我要导出到Access中去,Access的长整型仅支持-2147483648到2147483647,也就是相当于MySQL的Signed INT
我使用的语句如下:
SELECT
...
INET_ATON(`client`.`IP`) AS CLIENT_IP,
...

谁能教我一下?
作者: 枫影谁用了    时间: 2009-02-23 10:18
用字符。没有更大的。
作者: sunnyfun    时间: 2009-02-24 13:36
不想用字符串的话,把4294967295减去2147483648再存好了
作者: vinhlam    时间: 2009-02-24 22:13
现在就是有点儿头痛,如果INET_ATON(IP)算出的值在0~2147483647之间,则不变,如果在2147483648至4294967295之间,则需要送去4294967296,不知这个表达式怎么写。
作者: 枫影谁用了    时间: 2009-02-25 08:57
原帖由 vinhlam 于 2009-2-24 22:13 发表
现在就是有点儿头痛,如果INET_ATON(IP)算出的值在0~2147483647之间,则不变,如果在2147483648至4294967295之间,则需要送去4294967296,不知这个表达式怎么写。

select


&nbsp;&nbsp;if (INET_ATON(a.`ip_start`)  < 2147483647,INET_ATON(a.`ip_start`),4294967295) as ip_start ,



&nbsp;if (INET_ATON(a.`ip_end`)  < 2147483647,INET_ATON(a.`ip_end`),4294967295) as ip_end




from    `t_province_ip_new` a

作者: vinhlam    时间: 2009-02-25 10:18
非常谢谢版主大驾帮助,不过,昨晚打错一个字了,引起了歧义。“如果在2147483648至4294967295之间,则需要送去4294967296”,
应是减去4294967296才对,也就是把它变成负值,使其范围在有符号整数所在的-2^31---2^31-1之间。而不是返回4294967295这个值。
作者: 枫影谁用了    时间: 2009-02-25 10:20
那在后面减去就行了。

if (INET_ATON(a.`ip_start`)  < 2147483647,INET_ATON(a.`ip_start`),INET_ATON(a.`ip_start`)-4294967295) as ip_start
作者: vinhlam    时间: 2009-02-25 10:48
减去的这个语法有问题,本来结果应该是负值在的,而且范围在-2147483648到0之间的,结果却变成了一个21号的正整数,增大了N倍。不知怎么回事。
作者: vinhlam    时间: 2009-02-25 10:59
例如,203.200.235.191这个地址,使用INET_ATON(a.`ip_start`)之后,值变成了3418942399,如果使用如下表达式之后:INET_ATON(a.`ip_start`)-`)-4294967296
,值非但没有变成负数,反而增大了:184467440728335267,而我需要的正确值是:-876024897

[ 本帖最后由 vinhlam 于 2009-2-25 11:08 编辑 ]
作者: 枫影谁用了    时间: 2009-02-25 12:27
mysql> select INET_ATON("203.200.235.191") - - - 4294967296
&nbsp;&nbsp;&nbsp;&nbsp;-> ;
+-----------------------------------------------+
| INET_ATON("203.200.235.191") - - - 4294967296 |
+-----------------------------------------------+
|                                    -876024897 |
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql>

作者: 枫影谁用了    时间: 2009-02-25 12:29
http://dev.mysql.com/doc/refman/ ... rithmetic-functions

看一下数学运算这一节。^_^以前我也没留意
作者: vinhlam    时间: 2009-02-25 17:30
问题看起来终于圆满地解决了!
超级感谢“枫影谁用了”实习版主!
作者: 枫影谁用了    时间: 2009-02-25 17:34
解决了是好,更好是知其所以然。
作者: vinhlam    时间: 2009-02-25 19:53
我会利用业余时间看你说的《函数和操作符》章节的,力争知其所以然。
如果您在北京的话,可以找个时间去跟您学习一下。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2