我的MySQL DB中的表以短十六进制格式保存IP地址,即“C0A80001”我想选择这个表中的1000个最近的条目,其中包括“NULL”、“8.8.8.8”、“192.168.*.*”、“10.*”以及B类网络(我还没有想出如何排除它)。
如果没有出狱,我有:
SELECT IP_Address
FROM Event_Table
ORDER BY Time_Created
DESC LIMIT 0, 1000;
当然,效果很好。当我添加排除项时,我会遇到错误:
SELECT IP_Address
FROM event_table
sourceIPAddr NOT IN ('NULL', '08080808') AND
(排除'NULL‘条目和'8.8.8.8')
IP_Address NOT LIKE 'C0A8%%' AND
(不包括‘192.168。*)*
IP_Address NOT LIKE '0A%%'
(不包括‘10*)
ORDER BY Time_Created
DESC LIMIT 0, 1000;
发布于 2014-01-21 05:00:12
如果您真的想节省空间,我建议将您的IP地址和网络掩码存储为整数值。它比十六进制值方便得多(我想知道你为什么选择这样做)。
MySQL为此提供了两个函数:将IP地址转换为整数值的阿顿()函数和反向NTOA()函数。
排除NULL和8.8.8.8
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) IS NOT NULL
AND INET_NTOA(sourceIPAddr) != '8.8.8.8';
排除192.168..。
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) NOT LIKE '192.168.%';
排除10.*
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) NOT LIKE '10.%';
%
在LIKE
中的意思是“任何给定字符的0倍或更多倍,实际上也是任意的。”你当然可以用
SELECT IP_Address
FROM event_table
WHERE
INET_NTOA(sourceIPAddr) NOT LIKE '10.%.%.%';
为了确定,中间有点,但没有必要。使用像LIKE ('whatever%%%')
这样的东西也没有什么区别。要搜索一个必须存在的字符(没有“一个字符0或1次”),可以使用下划线_
。
https://stackoverflow.com/questions/21258380
复制相似问题