mysql判断字段是否为数字

其中,判断该字段是否为MySQL中的数字是相当重要的。
首先,使用常规句子对你有好处。
例如,我之前编写的 SQL 如下所示:SELECT FROM table_name WHERE column_name REGEXP '^[0-9 ]+$'。
这是为了检查column_name中是否只有数字,对吗?
接下来,如果你想用小数点来检查小数点,你需要稍微改变一下,像这样:SELECT FROM table_name WHERE column_name REGEXP '^[0-9 ]+(.[0-9 ]+)?$',你看到添加了点符号。

还有另一种方法可以尝试转换正确的数据类型。
比如我之前写过这样的语句:SELECT FROM table_name WHERE COLUMN (column_name unsigned) IS NOT NULL,意思是将column_name转换为无符号整数。
如果转换成功,则该数字必须是一个值。

此外,您还可以编写函数来处理复杂的特定数字的形式,例如科学记数法。
它需要一些编程技巧,但它非常灵活。

最后,如果你想检查字段的数据类型,很简单,只需使用 SHOW QUESTION OR STICK 命令即可。
我使用 DESCRIBE table_name 来查看表结构。
我可以通过查看数据字段的类型立即得知。

但说实话,这些方法都会受到性能、数据不一致、特殊特性等因素的影响,所以使用时要根据实际情况,适当优化。
刚开始学这个的时候不太懂,现在终于明白怎么用了。

sql 检查字符是纯数字

记得去年夏天,在整理公司用户提交的数据时,我发现有一个字段完全无法读取。
经过检查,发现有前端同事不小心将数值字段保存为字符串。
我急得满头大汗,幸好通过挖掘正则表达式终于解决了问题。
但说实话,每次遇到这样的事情我都会很头疼。
如果能早点用数据库中包含的方法检查一下就更好了。

例如,回到 PostgreSQL,我编写了一个小工具,每次在插入数据之前运行一个查询: sql SELECT 'abc1 2 3 ' ~ '^[0-9 ]+$'
如果结果返回 null,则说明出现了问题。
然而,后来发现,如果用户输入负数,这个常规规则就不起作用。
需要重写如下: sql SELECT 'abc1 2 3 ' ~ '-?[0-9 ]+$'
几乎不起作用。
当时我向团队抱怨说写这些常规规则比写代码还繁琐。

我突然想到:数据量特别大的时候,正则化效率会不会出现问题?我查了资料,发现PostgreSQL的~操作符确实是优化过的,但是在Hive这样的分布式系统中,正则表达式执行会挂起很长时间。
有一次,在给客户定制数据时,我注意到在他们的Hive集群中使用REGEXP时,整个表实际上被分成了1 00个小块来计算,最后的计算一直持续到天亮。

其实CAST方法可能更直接。
我之前在 SQL Server 上尝试过: sql 选择 CASE WHEN TRY_CAST('1 2 3 4 5 ' AS INT) IS NOT NULL THEN '它是一个纯数' ELSE '它不是一个纯数' END
优点是不用担心正则表达式的细节,缺点是只能判断是否可以转换为整数类型。
无法识别“1 2 3 .4 5 ”等十进制数字。
有一次我测试了一下,发现“1 2 3 abc”居然转成了0,真是太神奇了。

说真的,现在我写代码已经习惯使用Python的isdigit方法了,一行代码就可以完成: 蟒蛇 'abc1 2 3 '.isdigit()
但是当涉及到数据库时,我发现每个系统都必须学习一种新方法。
我想知道你是否经历过陌生的情况?比如我曾经看到有人用LIKE'%[^0-9 ]%'来进行反向判断。
这个脑回路...

mysql中如何用sql表示不包含字符的sql?

说白了,使用MySQL检查不包含特定字符的记录有三种方法:NOT LIKE、NOT REGEXP、NOT IN。
这三招的核心就是反向筛选。

NOT LIKE 是最直观的,可以使用 % 通配符来完成。
例如,要检查未出现“abc”的记录,请编写 my_column NOT LIKE '%abc%'。
去年我们做了一个电商项目,用它过滤了用户评论中含有“敏感词”的记录,直接保存了2 000条脏数据。
但需要注意的是,当模式特别长或者字段值很多时,性能会爆炸。
到了3 000点左右就会开始放缓。
用行话来说,这称为雪崩效应。
事实上,前部的一个小延迟就会导致整个后部崩溃。

NOT REGEXP是普通版本,适合比较复杂的字符规则。
要检查没有数字的记录,my_column NOT REGEXP '[0-9 ]' 就足够了。
这比 NOT LIKE 更灵活,但是如果你写了错误的正则表达式,查询将会崩溃。
起初我以为“。
”会匹配任何字符,但我后来发现这是错误的,不得不使用“。
”为了逃避他。
例如,要检查没有特殊符号的记录,请编写 my_column NOT REGEXP '[!@$%^]'。

NOT IN 简单粗暴,直接排除几个固定值。
例如,要过滤名为“John”和“Mike”的用户,my_column NOT IN ('John', 'Mike')。
这是最简单的方法,但缺点是列值必须包含一些离散值,而不是范围等。
还有就是当排除的值太多时,查询效率会降低。
我测试了一下,当排除超过1 00个值时,比NOT LIKE慢5 0%以上。

说实话,这确实是一个骗局。
很多人不注意这一点。
我们建议首先使用 NOT LIKE 处理简单字符,使用 NOT REGEXP 处理复杂的正则化,使用 NOT IN 过滤固定值。
不要混合它们。
您认为哪一种更合适取决于数据的结构。