ip的mysql字段_MySQL 对 IP 字段的排序问题
MySQL 对 IP 字段的排序问题
问题描述
想对一张带有 IP 字段的表,对IP 字段进行升序排序,方便查看每个段的 IP 信息。
表结构和表数据如下:
SETNAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;--------------------------------Table structure for t_ip------------------------------
DROP TABLE IF EXISTS`t_ip`;CREATE TABLE`t_ip` (
`id`int(11) NOT NULLAUTO_INCREMENT,
`ip`varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',PRIMARY KEY(`id`) USING BTREE
) ENGINE= InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT =Dynamic;--------------------------------Records of t_ip------------------------------
INSERT INTO `t_ip` VALUES (1, '192.168.10.8');INSERT INTO `t_ip` VALUES (2, '192.168.10.9');INSERT INTO `t_ip` VALUES (3, '192.168.10.10');INSERT INTO `t_ip` VALUES (4, '192.168.10.1');INSERT INTO `t_ip` VALUES (5, '192.168.8.8');INSERT INTO `t_ip` VALUES (6, '192.167.10.8');INSERT INTO `t_ip` VALUES (7, '192.167.8.8');INSERT INTO `t_ip` VALUES (8, '92.168.10.8');INSERT INTO `t_ip` VALUES (9, '92.68.10.8');SET FOREIGN_KEY_CHECKS = 1;
数据库查询截图如下:
如果按照 IP 字段升序,查询效果如下:
问题原因
由于 IP 字段是varchar 类型,MySQL在进行排序的时候,并不会将 IP中的 “192”和“92” 自动识别为数字进行处理,而是作为字符串处理了。
因此,会查询到的结果达不到预期。
问题解决
如果想要将92开头的IP,排在192开头的之前,并且每个. 分隔的段都要保持数字上的升序,需要对 IP 字段按照 . 进行分解为4段,逐次排序处理。
处理 SQL 如下:
select ip fromt_ipORDER BY
CONVERT(SUBSTRING_INDEX(ip, '.', 1), SIGNED),CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 2), '.', -1), SIGNED),CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 3), '.', -1), SIGNED),CONVERT(SUBSTRING_INDEX(ip, '.', -1), SIGNED);
处理后的效果截图如下(此时已经达到了预期的排序效果):
【说明】
此处用到了MySQL的两个库函数:
1) CONVERT(expr,type): 此函数的作用是将表达式转换为特定类型
如:上面用到的 CONVERT(SUBSTRING_INDEX(ip, '.', 1), SIGNED) 是将ip字段中获取的第一位,转换为整数。
2)SUBSTRING_INDEX(str,delim,count):此函数的作用是将一个字段串,按照某个标识字符串截取,并获取第几个之前
如:SUBSTRING_INDEX(ip, '.', 1) 是将IP按照 '.' 分隔,获取第一位。如果是ip是 192.168.10.8,获取的就是 192
SUBSTRING_INDEX(ip, '.', -1) 是将IP按照 '.' 分隔,获取最后一位。如果是ip是 192.168.10.8,获取的就是 8
额外补充
如果IP字段中存在多IP,如:192.168.10.2,194.16.12.123,要求排序的时候,按照逗号前的第一个IP参与排序。需要如何实现呢?
如果还是按照上面的SQL,发现不能适配该场景,效果如下:
此时,需要对多IP的场景的逗号稍微处理下即可,处理SQL如下:
select ip fromt_ipORDER BY
CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(ip, ',', 1), '.', 1), SIGNED),CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(ip, ',', 1), '.', 2), '.', -1), SIGNED),CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(ip, ',', 1), '.', 3), '.', -1), SIGNED),CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(ip, ',', 1), '.', -1), SIGNED);
该SQL的查询效果如下:
ip的mysql字段_MySQL 对 IP 字段的排序问题相关推荐
- mysql自增字段_MySQL自增字段的常用语句
学习MySQL数据库,MySQL自增字段是最基础的部分之一,下面为您介绍一些MySQL自增字段的常用语句,希望对您学习MySQL自增字段能些许帮助. 1.创建表格时添加: create table t ...
- mysql如何加个字段_mysql如何添加字段 | mysql添加字段
alter table `sysinfo` add `fact_num` int(11); 添加字段并设置默认值: alter table `channel` add `needrestart` in ...
- mysql视图怎么加字段_mysql视图添加字段
mysql视图里面怎么新增一个全新字段,在原来表内没首先,要清楚视图的概念: 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数 ...
- mysql用户ip登录失败怎么办_MySQL使用IP地址登录 ERROR 1045 (28000) Access denied for use...
MySQL使用IP地址登录 ERROR 1045 (28000) Access denied for use MySQL使用IP地址登录 ERROR 1045 (28000): Access deni ...
- mysql 预留一个自定义字段_MySQL 按指定字段自定义列表排序 | DevOps
问题描述 大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例, 下同): SELECT * FROM `MyTable` WHERE `id` IN (1, 7, 3, 5) ...
- mysql在线增加字段_MySQL在线加字段实现原理
作者:vinchen 腾讯互娱内部维护了一个TMySQL分支,基于官方5.5.24,实现了类似于Oracle 11g的快速加字段功能.该功能通过扩展存储格式来实现,原理类似于Oracle 11g,以下 ...
- 无法用ip连接mysql数据库_MYSQL数据库无法使用IP访问的方法
MYSQL数据库无法使用IP访问的方法 Windows下面首先要保证防火墙例外中含有mysql的端口如3306 PHP+mysql的时候发现连接数据库只能使用localhost,但是使用IP就不能连接 ...
- mysql增加中文字段_mysql怎么添加字段
在MySQL中编写sql语句时,会添加字段是非常重要的,例如:已创建表不足以满足要求时,这时就需要增加字段,已达到要求. mysql添加字段的方法: 首先以下面创建的表为例:CREATE TABLE ...
- mysql小数类型字段_mysql小数类型字段,float,double
mysql float double类型 1.float类型 float列类型默认长度查不到结果,必须指定精度, 比如 num float, insert into table (num) va ...
最新文章
- docker 容器占用内存_如何限制Docker容器的内存
- spark 资源参数调优
- 并发编程-14线程安全策略之并发容器(J.U.C)中的集合类
- Golang 入门笔记(二)下
- 十种图像模糊算法的总结与实现
- centos mysql 安装 yum源_Linux - CentOS 7 通过Yum源安装 MySql 5.7
- 洛谷-P1160 队列安排
- 十六进制转八进制(java)
- logback 配置详解
- c语言中短路逻辑有与有或例子,C语言零基础教程之运算符和表达式,全面解析,轻松上手...
- OC中对象的description方法
- [转载] real和imag在python_Python numpy.imag() 使用实例
- 为-微软-重写-TechNet Library-中-Microsoft Lync Server 2010
- 计算机的静态存储区在哪里,静态随机访问存储器
- 免费错别字检测、在线纠错工具
- 软件安全之动态链接库的使用 Libzplay 播放音乐
- warning: ISO C forbids an empty translation unit [-pedantic]
- MySQL kill进程后出现killed
- windows 技术篇 - 远程访问服务器空白桌面问题解决方法
- 从零开始的图像语义分割:FCN快速复现教程(Pytorch+CityScapes数据集)