首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分析MySQL中隐式转换导致查询结果错误及索引不可用

在日常工作中经常会遇到客户反馈,针对一个等值查询,为什么查询出来结果是错误呢?而此刻我内存独白是:一定是sql语句写有问题呗,找我干啥?...注意: 在过滤字段为数值类型时候,数值类型有一种隐式转换,如果以数字开头,包含有字符,后面的字符将被截断,只取前面的数字,如果不以数字开关将被置为0。...字段(varchar类型),上面有一辅助索引idx_ename,并且ename中有两个是全数字,若有这样查询select * from emp where ename=123456; 上面的SQL...,结果是一样, 所以只要是转化为浮点数之后是相等,那么,经过隐式转化后比较也会相等,我们继续进行测试其他转化为浮点型相等字符串结果 root@localhost [wjq]>SELECT...因此,当MySQL遇到字段类型不匹配时候,会进行各种隐式转化,一定要小心,有可能导致精度丢失。

1.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

从 MySQL 执行 update 报错 ERROR 1292 说起

事情是这样,上周五下班前通过自动化工具执行开发人员事先写好 SQL 时,自动化工具执行失败了,于是手动去生产环境执行,就发生了错误 “ERROR 1292 (22007): Truncated incorrect...DOUBLE value”,截断不正确 DOUBLE ,难道是数据类型长度不够,接下来我们查看一下表结构。...但是从下面的更新结果来看,只是将 id=1 值更新成了 0 并没有将 c 列更新成 6 ,不符合预期。要想更新多列,则不能使用 AND,可以使用逗号分隔。...虽然错误是因为子句语法问题,但 MySQL 错误描述也误导我是认为有问题,触发此错误原因之一是在更新表多列时使用了 AND 子句,而没有使用逗号分隔多列。...0、1、0、1 这不是布尔么,在 MySQL 中,优化器将"set id=" 和 where 之间子句当做一个来处理,‘6’ and c=‘6’ 结果被认为是 真,故更新为 id=1,‘6’ and

31920

这次被坑惨了,MySQL隐式转换导致了一个线上BUG

一个等值查询为什么会有另外一个不同记录查询出来呢? 我们一起来看看究竟!...,结果是一样, 所以只要是转化为浮点数之后是相等,那么,经过隐式转化后比较也会相等,我们继续进行测试其他转化为浮点型相等字符串结果 mysql > select '170325171202362931...因此,当MySQL遇到字段类型不匹配时候,会进行各种隐式转化,一定要小心,有可能导致精度丢失。...和str_col进行比较时候,他无法利用索引,同时取出来也是错误, mysql > show warnings; +---------+------+---------------------...| +---------+------+----------------------------------------+ MySQL针对3c 和 4d这两个进行了转化,变成了3和4 小结 在数据库中进行查询时候

45920

PageHelper导致自定义Mybatis拦截器不生效

一个等值查询为什么会有另外一个不同记录查询出来呢? 我们一起来看看究竟!...所以只要是转化为浮点数之后是相等,那么,经过隐式转化后比较也会相等,我们继续进行测试其他转化为浮点型相等字符串结果。...因此,当 MySQL 遇到字段类型不匹配时候,会进行各种隐式转化,一定要小心,有可能导致精度丢失。...和str_col进行比较时候,他无法利用索引,同时取出来也是错误: mysql > show warnings; +---------+------+---------------------...| +---------+------+----------------------------------------+ MySQL 针对3c 和 4d这两个进行了转化,变成了3和4 三、小结 在数据库中进行查询时候

51630

数据库MySQL-数据类型

3、整形支持显示宽度,显示宽带是最小显示位数,必须结合zerofill才起作用 2、浮点型 浮点型 占用字节数 范围 float(单精度型) 4 -3.4E+38~3.4E+38 double(精度型...-> num1 float(5,2), -- 浮点数 -> num2 double(6,1) -- 精度数 -> ); Query OK, 0 rows affected...stu6; +------+ | num | +------+ | 100 | +------+ 小结: 浮点数有单精度精度 浮点数支持科学计数法 浮点数精度会丢失 3、小数(定点数) 原理:...小结: 1、char是定长,var是变长 2、char最大是255,varchar最大是65535,具体要看字符编码 3、text系列在表中存储是地址 4、一条记录总长度不能超过65535 1.2.3...,第一个是1,第二个是2,以此类推,枚举在数据库存储是整形数字。

1.9K20

MySQL文档阅读(一)-数字类型

浮点类型(FLOAT、DOUBLE) FLOAT和DOUBLE类型代表近似。MySQL使用4个字节表示单精度、使用8个字节表示精度。...对于FLOAT类型,SQL标准规定一份可选精度规范,MySQL也支持这种可选精度规范,但是精度仅仅用于决定存储空间大小。...单精度FLOAT类型表示4个字节;24-53精度则需要精度DOUBLE类型表示。...MySQL5.7并不支持负数自动增长。 注意: 当该属性属于某个表达式或者UNION查询时,MySQL会忽略ZEROFILL属性。...SQL模式,则MySQL会根据数据类型能表示最大将该溢出截断,并存储该数据类型能表示最大;例如:当把一个溢出赋值给一个Integer属性,MySQL实际上存储是该Integer类型所能表示边界

1.3K10

号外!!!MySQL 8.0.24 发布

例如,诸如查询SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a) > 0可以重写为SELECT t1.* FROM t1 LEFT OUTER...30会产生不正确CPU掩码,该用于设置线程亲和力。...在优化ORDER BY子查询子句时,有可能清除在外部引用查询SELECT,这可能导致过早退出。(缺陷#31721430) mysql.func系统表中 名称格式错误可能会导致服务器意外行为。...(缺陷#29559793) 卸载插件可能会影响后续准备好语句执行。(缺陷#29363867) CAST()截断发生时,将 字符串用户定义变量或函数结果转换为精度(例如,使用 )不会发出警告。...这对于大数尤其成问题,因为大数精度因此可以小到1,并且可以四舍五入为绝对超出DBL_MAX,因此可以被JSON解析器拒绝。 现在,这样数字始终以6精度打印在优化程序跟踪中。

3.6K20

MySQL数据库中不同数据类型字段关联后结果居然有这么大差异?

`pid` WHERE a.id =1459066134882947196 查询结果如下: 结果为非预期,因为2个表关联字段内容并不相同 1.3 使用内连接 SELECT a.id,b.pid...`pid` WHERE a.id =1459066134882947196 使用内连接后,结果也不正确 1.4 不加where条件左连接 SELECT a.id,b.pid FROM tb1...`pid` 查询结果如下: 关联后确实是非预期结果 1.5 不加where条件内连接 SELECT a.id,b.pid FROM tb1 a JOIN tb2 b ON a.id=...`pid` 查询结果为: 此时不加where条件内连接结果却是正确 2....bigint与varchar转换过程中字段精度出现问题,实际超过int最大数据(2147483647,即2^31 - 1)数据被截断为2^31 - 1处理,因为两表进行左关联时,存在异常。

27830

SQL中使用符号

'' 单引号字符:空字符串文字。字符串中文字单引号字符转义序列。例如:‘can’‘t’ ( ) 圆括号(40,41):用逗号分隔列表。将SQL函数参数括起来。...将过程、方法或查询参数列表括起来。大多数情况下,即使未提供参数或参数,也必须指定圆括号。在SELECT DISTINCT BY子句中,将用于选择唯一项或项逗号分隔列表括起来。...在SELECT语句中,将子查询括在FROM子句中。括起UNION中使用预定义查询名称。括起主机变量数组下标。...用于对谓词进行分组:WHERE NOT (Age12). (( )) 圆括号:禁止缓存查询文字替换。...:: 冒号:在触发器代码中,这个前缀表示该行开始标识符(::name)是主机变量,而不是标签行。 ; 分号(59):过程、方法、查询和触发器代码中SQL语句结尾分隔符。

4.2K20

数值微分|有限差分法误差分析

对舍入误差影响可能很大。 很小时, 几乎相等。当它们通过系数相乘再相加,可能会丢失几个有效数字。 以(1)为例,分子可能会为0。但是我们不能使h太大,因为这样截断错误将变得过大。...为了解决这个矛盾,我们可以采取以下措施: 1 使用精度浮点数运算 2 采用精确度至少为 有限差分公式 例如,用中心差分法计算 在 处二阶导数。...取不同 以及精度为 和 ,手算结果见下表 精确为 。精度为 时, 最佳为0.08。由于截断和舍入错误共同影响,三位有效数字丢失。...大于最佳,主要错误是由截断引起。 小于最佳,舍入误差变得明显。 精度为 时,结果精确到四位有效数字。这是因为额外精度降低了舍入误差。最佳 约为0.02。...ddf = ( math.exp(-(x+h)) - 2*math.exp(-(x)) + math.exp(-(x-h)) ) / (h*h) print(ddf) 输出结果: h取值对精度计算影响不大

2.5K20

SQL查询四舍五入 解决方法

则需要把上面的改为SEL 大家好,我是架构君,一个会写代码吟诗架构师。今天说一说SQL查询四舍五入 解决方法,希望能够帮助大家进步!!!...而后者则没有被截取,四舍五入时自然就会得到123.76000 ROUND 返回数字表达式并四舍五入为指定长度或精度。...length 是 numeric_e-xpression 将要四舍五入精度。length 必须是 tinyint、smallint 或int。...如果省略 function 或 function 为 0(默认),numeric_e-xpression 将四舍五入。当指定 0 以外时,将截断 numeric_e-xpression。...使用 ROUND 截断 下例使用两个 Select 语句说明四舍五入和截断之间区别。第一个语句四舍五入结果。第二个语句截断结果。

78730

SQL函数 %SQLUPPER

表达式可以是子查询。 maxlen - 可选 — 一个整数,指定整理后将被截断为 maxlen 。请注意, maxlen 包括附加前导空格。...您可以用括号将 maxlen 括起来以抑制文字替换:((maxlen))。描述SQLUPPER 是默认排序规则。%SQLUPPER 将表达式转换为排序为(不区分大小写)大写字符串格式。...例如,如果插入带有 maxlen 截断字符串,则插入完整字符串,并且可以通过 SELECT 语句检索;此字符串全局索引被截断为指定长度。...不要在其他用户访问表数据时重建索引。这样做可能会导致查询结果不准确。其他大小写转换函数%SQLUPPER 函数是 SQL 中转换数据以进行不区分大小写比较或排序规则首选方法。...665 Ash Drive, 672 Main Court, 6754 Oak Court, 6986 Madison Blvd, 7000 Ash Court, 709 Oak Avenue,示例以下查询使用带有字符串截断

1.4K10

谈谈MySQL如何选择float, double, decimal

在查阅资料可知,单精度类型float和精度类型double在计算机中存储时候,由于计算机只能存储二进制,所以浮点型数据在存储时候,必须转化成二进制。...,对于double类型分配了64位,但是并不是所有的实数都能转成32位或者64位二进制形式,如果超过了,就会出现截断,这就是误差来源。...,更何况小数,所以存储空间大小决定存储精度,和D无关。...所以如果一个实数在MySQL中存储准确的话,会出现以下三种情况 数据真的准确,数据能在有限存储空间里完全存储起来 数据存储被截断,但是通过四舍五入依然能够将数据显示准确 数据存储被截断,通过四舍五入不能将数字正确显示...,已经满足我们大部分浮点型数据存储精度要求,如果还要精益求精,则使用decimal定点型存储 比如一些科学数据,精度要求很高金钱 写在最后 理论上东西永远比不上实践,应用场景大于一切理论。

4.2K42
领券