Mysql中关于0值判断的坑及解决

目录
  • Mysql关于0值判断的坑
    • 简练问题如下
    • 原因
    • 解决方式
    • 问题引申
  • Mysql判断数值0误区总结

Mysql关于0值判断的坑

最近遇到一个Mysql返回多值的问题,最后发现是mysql过滤条件中0值判断的问题。

简练问题如下

有个INT字段a,默认值为0,程序传入的判断条件是 a = 'abacd'。

传入的是一个字符串,结果a=0的所有数据都返回了。

原因

mysql会在逻辑判断时,如果是整型判断,但是传入的是字符串,如果字符串不是数字,则字符串会被转换为0。所以,

这段代码实际判断的条件是 a = 0。

解决方式

mysql中的逻辑判断,判断值的传入,应该与字段类型一致,整型判断整型,字符串判断字符串。如果避免不了,跨类型的判断,那么就需要根据业务逻辑,进行调整,避免掉入这个坑。

问题引申

如果字段a是否varchar类型,值为0,那么判断时应该用 a='0'判断,而不是 a = 0 判断,原因与上面的原因一致,字符串会被转换为0,结果最终判断的是 0 = 0。

Mysql判断数值0误区总结

mysql中判断数据表字段是否为0,当前数据表字段为int类型时,没有问题。若为char或者varchar类型时,则需要使用'0',显而易见,字符串和整型是不能等同的。所以不要 犯这么低级的错误。

以下是从网上搜索到的mysql搜索的原理:

mysql会把字段的值先转成整数,然后再对比。

如果字段的第一位是字符串,那么转成整数就是0了,

一般对字符串的搜索都要加上引号。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MySQL自增列插入0值的解决方案

    在将数据库从MSSQL迁移到MySQL的过程中,基于业务逻辑的要求,需要在MySQL的自增列插入0值.在MSSQL中是这样完成的: 复制代码 代码如下: string sql;sql = " set identity_insert dbo.AppUsers on " + " insert dbo.AppUsers (Id, IsLocked, IsMustChangeLocalPassword, IsAvailable, Name, Sequence, CreatedBy,

  • MySQL慢查询的坑

    一条慢查询会造成什么后果?年轻时,我一直觉得不就是返回数据会慢一些么,用户体验变差?其实远远不止,我经历过几次线上事故,有一次就是由一条SQL慢查询导致的. 记得那是一条查询SQL,数据量万级时还保持在0.2秒内,随着某一段时间数据猛增,耗时一度达到了2-3秒!没有命中索引,导致全表扫描.explain 中extra显示:Using where; Using temporary; Using filesort,被迫使用了临时表排序,由于是高频查询,并发一起来很快就把DB线程池打满了,导致大量查询

  • Mysql NULL导致的神坑

    比较运算符中使用NULL mysql> select 1>NULL; +--------+ | 1>NULL | +--------+ | NULL | +--------+ 1 row in set (0.00 sec) mysql> select 1<NULL; +--------+ | 1<NULL | +--------+ | NULL | +--------+ 1 row in set (0.00 sec) mysql> select 1<>

  • Mysql中关于0值判断的坑及解决

    目录 Mysql关于0值判断的坑 简练问题如下 原因 解决方式 问题引申 Mysql判断数值0误区总结 Mysql关于0值判断的坑 最近遇到一个Mysql返回多值的问题,最后发现是mysql过滤条件中0值判断的问题. 简练问题如下 有个INT字段a,默认值为0,程序传入的判断条件是 a = 'abacd'. 传入的是一个字符串,结果a=0的所有数据都返回了. 原因 mysql会在逻辑判断时,如果是整型判断,但是传入的是字符串,如果字符串不是数字,则字符串会被转换为0.所以, 这段代码实际判断的条

  • MySQL5.7中的sql_mode默认值带来的坑及解决方法

    在正常项目开发过程中,如果MySQL版本从5.6升级到5.7版本.作为DBA在考虑数据库版本升级带来的影响时,一般会有几个注意点: sql_mode optimizer_switch 本文主要内容是MySQL升级到5.7版本之后,由于默认的 sql_mode 值带来的坑以及对应的解决方案. 案例一:ONLY_FULL_GROUP_BY 问题描述 MySQL版本从5.6升级至5.7之后,部分SQL执行报错,报错信息如下: ERROR 1055 (42000): Expression #3 of X

  • MySQL中关于null值的一个小问题

    今天在测试null值的时候,发现了一个小问题,记录在这里,不知道大家以前遇到过没. 事情发展是这样的,在过滤一个表中的数值的时候,需要把age=2的列给剔除掉,然后查看剩余的列信息,这个操作看起来比较简单,我用一个表模拟一下过程: CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `age` int(11) DEFAULT NULL,   `score` varchar(20) NOT NULL DEFAULT '',

  • 一文介绍mysql中TINYINT取值范围

    目录 项目场景: 问题描述: 原因分析: 解决方案: 项目场景: 最近在开发过程中,看见表设计中是thinyint字段,但对于它的范围产生了好奇 问题描述: 当我们填写超过128数值的时候,该字段就会报以下错误 Cause:com.mysql.jdbc.MysqlDataTruncation:Data truncation:Out of range value for column 'priority' at row 1; 原因分析: 从 -2^7 (-128) 到 2^7 - 1 (127)

  • python用dataframe将csv中的0值数据转化为nan缺失值字样

    用到这个语句. c[c==0]=np.nan 我们具体来看一下c和np是什么 np就是我引入的pandas库, c呢是我读入csv文件的其中一列,列名为"上行业务量GB" df是整个csv文件的数据,他的类型是dataframe import numpy as np import pandas as pd # 打开文件 FileName= '长期编号.csv' df = pd.read_csv(FileName, encoding='utf-8') c = df[['上行业务量GB']

  • MySQL中列转行和行转列总结解决思路

    目录 引言 列转行 行转列 总结 引言 在学习sql中遇到了列转行和行转列的题目,这里总结一下如何在对应的情景下解决不同的题目: 列转行 创建一个表stu_score_01: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for stu_score_01 -- ---------------------------- DROP TABLE IF E

  • MySQL中Union子句不支持order by的解决方法

    本文实例讲述了MySQL中Union子句不支持order by的解决方法.分享给大家供大家参考,具体如下: 我对DB知之甚少,这问题只在MySQL遇到,不知道别的DBMS是不是也如此. 问题是这样的,我打算在一个表里获得与某一行记录相邻的两行,并且想通过union一起取出来,所以这么写: select id,title from subjects where id>#some_id# order by id limit 1 union select id,title from subjects

  • mybatis中 if-test 数字判断的坑及解决

    目录 if-test数字判断的坑 mybatis的test判断注意事项 if-test数字判断的坑 在项目中偶然发现一个判断数字的if没有起任何作用,代码如下 <if test="timeType !=null and timeType!='' and timeType == '3'">     AND     ... </if> 经过查询资料发现,mybatis是用OGNL表达式来解析的,在OGNL的表达式中,数字’3’会被解析成字符,java是强类型的,ch

  • MySQL中对于NULL值的理解和使用教程

    NULL值的概念是造成SQL的新手的混淆的普遍原因,他们经常认为NULL是和一个空字符串''的一样的东西.不是这样的!例如,下列语句是完全不同的: mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (""); 两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串.第一个的含义可以认为是"电话号码不

  • MySQL中的布尔值,怎么存储false或true

    MySQL布尔值,存储false或true 简明说,数据库存储的布尔值是0和1,相当于一个字节的INT型整数 具体操作 如果是可视化界面,可以直接选择Boolean,长度设置为1.其最终显示的效果等价于TINYINT(1) 所以,zero == false:nonzero == true MySQL数据库存储布尔值 在Java编程中,我们经常会遇到将boolean值写入到mysql数据库的情况.但是,mysql数据库是没有boolean类型的,它的boolean值是用数字0和1来表示的. 下面,

随机推荐