今天下午产品的需求中要求要把一个数据库字段类型是text类型,但是字段里面的字段值是纯数字的记录找出来做统计使用,开始觉得不能够实现,后面网上查了一下,最后按照产品的要求做出来了,但是实现的过程中出现一些小坑,并且发现网上的说法中有的是错误的,做一个纠正。

最开始的时候通过网上查资料搜到的方法是想通过正则匹配。(之前有个错误的认识,觉得正则匹配会严重影响效率)。不是特别愿意使用正则匹配,想通过其他方式实现。正好看到一个人提了一种方法。

"select * from tt where length(0+name)=length(name);"

我按照这个方法写了一下,跑了一下貌似可以,但是这个字段中会有存放'-'和'+'的情况,这种情况下的也被筛选了出来。然后再加个筛选条件把这两种情况过滤出去。这样表面上看是可以了。

但是得需要把这个写法的原理解释清楚,就接着找了一下mysql中length()的作用,网上查出来的作用是:mysql的一个用来来获取字符串长度的内置函数方法。按照这个作用的思路来的话,是解释不通的。但是为什么能查出来结果呢!?

然后就把关键部分单独拿出来,在mysql中执行

sql语句

运行结果

select LENGTH('test') as test1;

4

select LENGTH(0+'test') as test2;

1

select 0+'test' as test3;

0

select LENGTH('30') as test4;

2

select LENGTH('30'+0) as test5;

2

select '30'+0 as test6;

30

从上面的结果中,这就能说明问题了:字段类型是char,字段值是字符串的话,把字段的值加上0得到的结果是0。但字段值是要是数字的话,它加0的时候是把它当成数字在加的。那么这种情况下,数字在加0前后的长度是不变化的,确实能筛选出来;字符串的话在加了0之后长度就变成1了,就不等了就被过滤了出去(这里面有一个十分严重的坑,就是我测试的时候,数据库里面的字符串没有长度为1的字符串。加0操作后长度就变化了。)其实'-'和'+'也被筛选出来,就是因为它们的长度是1.但是这两个符号特殊,让我产生了误解,朝着把它们理解成是正号和负号的方向去考虑了。这点上也说明了想测试用例的时候,覆盖面要广是多么的重要!!!

接下来就确定下来使用正则规则去匹配。刚开始写出来的sql:

SELECT * FROM TEST WHERE (RESULT REGEXP '[^0-9.]') = 0;

{String} REGEXP '[^0-9.]'的作用就是如果String中含有不是0-9之间的数字或者是小数点时,返回true(1) ,反之则返回false(0)。返回值是0的时候正好符合我们的要求。

对正则熟悉的人就能马上看出问题来。

这样的话,是能把含有数字的字段过滤出来,但是出现类似'1.2.2.2.2'这种规则的数字的话也能被筛选出来,但是这在数学上是错误的,不能用来进行计算的。所以需要进一步修改,又得到如下写法:

SELECT * FROM TEST WHERE RESULT REGEXP '(^[0-9].[0-9]$)|(^[0-9]$)'

这种写法是只能限定死得到的小数类型在整数部分只能有一位。再经过查询资料最后得到写法

SELECT * FROM TEST WHERE RESULT REGEXP '(^[0-9]+.[0-9]+$)|(^[0-9]$)'

过程中查询到有价值的信息:

过程中,思路来源于参考了以下博文:

最后看一下刚开始担心的效率问题:

一共9125条数据,

SELECT * FROM TEST 用时:0.015

SELECT * FROM TEST WHERE RESULT REGEXP '(^[0-9]+.[0-9]+$)|(^[0-9]$)' 用时:0.028

SELECT * FROM TEST WHERE RESULT REGEXP '(^[0-9].[0-9]$)|(^[0-9]$)' 用时:0.018

可以看出要是规则复杂的正则表达式的话,效率上确实是会有明显的影响的。

mysql判断纯数字_MYSQL中判断字符串是否为纯数字相关推荐

  1. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  2. C++在数字N中找到精确除以N的数字的算法(附完整源码)

    C++在数字N中找到精确除以N的数字的算法 C++在数字N中找到精确除以N的数字的算法完整源码(定义,实现,main函数测试) C++在数字N中找到精确除以N的数字的算法完整源码(定义,实现,main ...

  3. C++在数字向量中找到出现奇数次的数字的算法实现(附完整源码)

    C++在数字向量中找到出现奇数次的数字的算法实现 C++在数字向量中找到出现奇数次的数字的算法实现完整源码(定义,实现,main函数测试) C++在数字向量中找到出现奇数次的数字的算法实现完整源码(定 ...

  4. mysql 是否是数字_mysql 如何判断 字符串 是否为 数字

    这个问题有点怪 ,但很多时候我们会以字符串的形式存储数字 , 反过来我们用字符串进行数学运算时, 好像也不会出错 . 除非 , 用作数学运算的字符串不能转换成数字 . 但是我们改如何判断字符串是否能转 ...

  5. mysql提取数字_Mysql中实现提取字符串中的数字的自定义函数分享

    因需要在mysql的数据表中某一字符串中的字段提取出数字,在网上找了一通,终于找到了一个可用的mysql函数,可以有效的从字符串中提取出数字. 该mysql提取出字符串中的数字函数如下: 复制代码 代 ...

  6. android 判断 string 是否是字母数字,Android中判断字符串中必须包含字母或者数字...

    public static boolean isLetterDigit(String str){ boolean isDigit = false;//定义一个boolean值,用来表示是否包含数字 b ...

  7. mysql 模糊匹配比自己短潆字符_mysql中生成字符串对应的英文字母(拼音首字母)...

    mysql中生成字符串对应的英文字母(拼音首字母)的存储过程,触发器和函数 1.规则 1.1.输入字符串长度255(可变),输出字符串10(可变) 1.2.对于全英文字母或数字,输出空格后的首字符,均 ...

  8. java 判断 中文字符_java中判断字符串中是否有中文字符

    package com.meritit.test; public class TestChart { public static void main(String[] args) throws Exc ...

  9. mysql数字_MySQL 中的数字类型

    MySQL 中数据类型常用的就三大类: 数字类型/numeric types 日期和时间/date and time types 字符类型/string (character and byte) ty ...

最新文章

  1. 线上经验总结:一台 Java 服务器可以跑多少个线程?
  2. Visual C++——《可视化编程技术》实验报告——资源的应用—反弹的球
  3. 阿里大数据技术如何进化?资深技术专家带你回顾
  4. mysql删除属性_SQL语句处理一些修改、新增、删除、修改属性操作(MySql)
  5. [vue] vue生命周期的作用是什么?
  6. 论文浅尝 | 面向时序知识图谱推理的循环事件网络
  7. php二分查找算法时间复杂度,一个运用二分查找算法的程序的时间复杂度是什么...
  8. linux java mail 时间,Javamail在Windows上工作,而不是在Linux上
  9. HTML基础概念——head头部,及标签(文本、图像类型)
  10. 用注解给映射视图的类创建联合主键
  11. LINUX CENTOS 7 X86_64中开始菜单的编辑安装软件alacarte即可
  12. DHI Mike 后处理工具——污染带面积、长度、宽度统计工具
  13. 深入了解现场服务软件的投资回报率(ROI)
  14. 2018 最新直播接口
  15. 基于mysql 批量插入100w测试数据
  16. timer延迟1us_STM32 Systick定时器在实现1us延时的问题与解决
  17. 何一娜:诺基亚软件开发工程师典型的一天
  18. 怎样做网络推广浅析网站标题如何写更利于SEO?
  19. 收藏几个好用的webservice
  20. 理解冲突域与广播域,交换机与路由器

热门文章

  1. 机器学习python基础(一)魔法命令
  2. 交叉销售功能介绍-功能
  3. ROG 幻16无线网卡驱动无法更新
  4. whm 设置共享IP
  5. linux 编辑文件乱码,Linux中vi编辑器显示中文乱码的问题
  6. C++primer十万字笔记 第九章 顺序容器
  7. 基于h5的航空订票系统的设计与实现
  8. TypeError: ufunc ‘isnan‘ not supported for the input types, and the inputs could not be...可能的原因记录
  9. 【论文阅读】Improving Document-level Relation Extraction via Contextualizing Mention Representations and W
  10. Teamview 禁用QuickConnect按钮