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 字段的排序问题相关推荐

  1. mysql自增字段_MySQL自增字段的常用语句

    学习MySQL数据库,MySQL自增字段是最基础的部分之一,下面为您介绍一些MySQL自增字段的常用语句,希望对您学习MySQL自增字段能些许帮助. 1.创建表格时添加: create table t ...

  2. mysql如何加个字段_mysql如何添加字段 | mysql添加字段

    alter table `sysinfo` add `fact_num` int(11); 添加字段并设置默认值: alter table `channel` add `needrestart` in ...

  3. mysql视图怎么加字段_mysql视图添加字段

    mysql视图里面怎么新增一个全新字段,在原来表内没首先,要清楚视图的概念: 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数 ...

  4. 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 ...

  5. mysql 预留一个自定义字段_MySQL 按指定字段自定义列表排序 | DevOps

    问题描述 大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例, 下同): SELECT * FROM `MyTable` WHERE `id` IN (1, 7, 3, 5) ...

  6. mysql在线增加字段_MySQL在线加字段实现原理

    作者:vinchen 腾讯互娱内部维护了一个TMySQL分支,基于官方5.5.24,实现了类似于Oracle 11g的快速加字段功能.该功能通过扩展存储格式来实现,原理类似于Oracle 11g,以下 ...

  7. 无法用ip连接mysql数据库_MYSQL数据库无法使用IP访问的方法

    MYSQL数据库无法使用IP访问的方法 Windows下面首先要保证防火墙例外中含有mysql的端口如3306 PHP+mysql的时候发现连接数据库只能使用localhost,但是使用IP就不能连接 ...

  8. mysql增加中文字段_mysql怎么添加字段

    在MySQL中编写sql语句时,会添加字段是非常重要的,例如:已创建表不足以满足要求时,这时就需要增加字段,已达到要求. mysql添加字段的方法: 首先以下面创建的表为例:CREATE TABLE ...

  9. mysql小数类型字段_mysql小数类型字段,float,double

    mysql float double类型 1.float类型 float列类型默认长度查不到结果,必须指定精度, 比如 num  float,  insert into  table (num) va ...

最新文章

  1. docker 容器占用内存_如何限制Docker容器的内存
  2. spark 资源参数调优
  3. 并发编程-14线程安全策略之并发容器(J.U.C)中的集合类
  4. Golang 入门笔记(二)下
  5. 十种图像模糊算法的总结与实现
  6. centos mysql 安装 yum源_Linux - CentOS 7 通过Yum源安装 MySql 5.7
  7. 洛谷-P1160 队列安排
  8. 十六进制转八进制(java)
  9. logback 配置详解
  10. c语言中短路逻辑有与有或例子,C语言零基础教程之运算符和表达式,全面解析,轻松上手...
  11. OC中对象的description方法
  12. [转载] real和imag在python_Python numpy.imag() 使用实例
  13. 为-微软-重写-TechNet Library-中-Microsoft Lync Server 2010
  14. 计算机的静态存储区在哪里,静态随机访问存储器
  15. 免费错别字检测、在线纠错工具
  16. 软件安全之动态链接库的使用 Libzplay 播放音乐
  17. warning: ISO C forbids an empty translation unit [-pedantic]
  18. MySQL kill进程后出现killed
  19. windows 技术篇 - 远程访问服务器空白桌面问题解决方法
  20. 从零开始的图像语义分割:FCN快速复现教程(Pytorch+CityScapes数据集)

热门文章

  1. 数据库、表数据的三种删除方式
  2. 电视盒子与机顶盒哪个好?当贝MAX 1才是最值得买的电视盒子
  3. 最新2010年遂宁论坛男女经典/(很有才、很搞笑)
  4. 莫让知识产权成电商上市的软肋
  5. 大一非计算机专业如何自学编程更高效?
  6. 互联网公司纷纷倒在了望京SOHO
  7. 我的电子游戏之旅--街霸与侍魂
  8. 计算机的英语显示,电脑开机后显示英文是为什么?
  9. 命运分支?时间倒流?时间冻结?
  10. 卷积网络和卷积神经网络_CNTK-卷积神经网络