mysql插入数据时判断是否包含在已有范围内 20C

比如我要插入一段IP(219.168.150.200),但是我数据库中有一条记录的IP是219.168.150.100-219.168.150.255。那么这条IP就包含在了数据库中的IP段范围中,这个怎么判断?

7个回答

数据库ip段开始和结束ip地址要转为数字来存储(两个字段),不能是字符串的,然后插入ip的时候将ip转为数字判断是否有between的记录,有就不插入

showbo
支付宝加好友偷能量挖 256*256*256*第一位+256*256*第二位+256*第三位+第四位
一年多之前 回复
showbo
支付宝加好友偷能量挖 回复qq_36375934: 2个bigint字段,一个存开始的,一个存结束的,开始ip和结束ip怎么转数字看下面的回复,注意是256,我打错了。第一~四位是针对219.168.150.100这个点号分割后来说的,这个ip的数字就是256*256*256*219+256*256*168+256*150+100,数据库存这个。你转为数字就方便比较了,直接 ip between 开始ip数字 and 结束ip数字就可以查询了,ip注意也要转数字
一年多之前 回复
qq_36375934
qq_charm 回复showbo: 这个是什么意思不太清楚,意思是开始IP和结束IP都用4个字段来分开存?
一年多之前 回复
showbo
支付宝加好友偷能量挖 回复showbo: 应该是256.。不是255,shit。。。
一年多之前 回复
showbo
支付宝加好友偷能量挖 IP转数字:255*255*255*第二位+255*255*第三位+255*第一位+第四位
一年多之前 回复

insert ignore的方式

通过截取的方式来判定,插入IP(219.168.150.200), substring(ip,0,11)跟IP段的网段一致,继续判断select count(1) from table1 where
substring(ip1,12)>=substring(ip2,12,3) and substring(ip1,12)<=substring(ip2,16,3) ,如果count(1)大于0就是已存在

INSERT INTO tablename(col)
SELECT '219.168.150.200' FROM DUAL WHERE NOT EXISTS
(SELECT * FROM tablename WHERE INET_ATON('219.168.150.200') BETWEEN INET_ATON(SUBSTRING_INDEX(col,'-',1)) AND INET_ATON(SUBSTRING_INDEX(col,'-',-1)));

这条sql必须行,除非我把题目理解错了。

qq_34457768
黄如果 回复u012119658: INET_ATON
一年多之前 回复
u012119658
hh20 IP地址用between and 可以找出来区间吗?
一年多之前 回复

题主看看这个可能会明白点https://bbs.csdn.net/topics/70511175

可以通过截取的方式来判定

我建议你仍然以 字符串 存储 ip, 自己写个函数实现这样两个功能:1. 去出最后一个 '.' 后面的子串。2.将这个子串转换成数字,然后与你指定的范围比较
这样一个判断其实也没有什么消耗, 而且实现起来很简单。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问