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

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

在日常的工作中经常会遇到客户反馈,针对一个等值查询,为什么查询出来的结果是错误的呢?而此刻我的内存独白是:一定是sql语句写的有问题呗,找我干啥?...但仍然建议在开发程序和生产库中尽量避免出现这样的SQL。...注意: 在过滤字段为数值类型的时候,数值类型有一种隐式转换,如果以数字开头的,包含有字符,后面的字符将被截断,只取前面的数字值,如果不以数字开关的将被置为0。...因此,当MySQL遇到字段类型不匹配的时候,会进行各种隐式转化,一定要小心,有可能导致精度丢失。...总结 不管是Oracle还是MySQL,在数据库中进行查询的时候,在查询过滤的时候,过滤条件一定要注意字段类型,杜绝隐式转化,这样不仅会导致查询缓慢,还会导致结果错误,这是生产业务所不能接受的;

1.9K20

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

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

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

    从 MySQL 执行 update 报错 ERROR 1292 说起

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

    64920

    单精度浮点数误差与消除方法

    技术背景 一个比较容易理解的概念,我们在做计算的过程中,很多时候都要做截断。不同精度的混合计算之间也会有截断,就比如一个float32单精度浮点数,符号占1位,指数占8位,尾数占23位。...那么问题就出现了,如果把一个双精度的浮点数转换成一个单精度的浮点数,就相当于舍弃了9位的有效数字,这就是做了一个截断。在一些特定的计算场景中,这种截断误差有可能会被累积,最终导致结果的错误。...大数吃小数 大数吃小数说的是,在两个数字之间运算的时候,如果是两个数字差异比较大,那么其中的小数的有效数字有可能在运算中被截断。...但是使用双精度浮点数就意味着内存占用的翻倍,计算也会更加的耗时,而且有一些硬件可能根本就不支持使用双精度浮点数。这里还有一个方法,那就是Kahan求和公式。...总结概要 在使用浮点数计算时,尤其是在使用AI框架的过程中,我们往往使用的是float32单精度浮点数,这也跟GPU的硬件架构有关系。

    59510

    谈谈那些R处理结果中非常小的p值

    Q:对于R中的一些测试,p值计算有一个下限2.22E-16,我不知道为什么是这个数字,它是否有有充分的理由,或者只是随意的。许多其他统计数据包的精度仅为0.0001,因此这是一个更高的精度水平。...double.xmax:双精度浮点数的最大规约值,即可表示的最大数。 double.base:双精度浮点数的基数,通常为2。 double.digits:双精度浮点数的有效位数。...double.exponent:双精度浮点数表示的数字的基数的指数范围。 double.min.exp:双精度浮点数的最小指数。 double.max.exp:双精度浮点数的最大指数。...在提交至期刊时,最好期刊是否有特定的规定。如果期刊没有规定,可以根据个人偏好进行选择,并在等待审稿人的意见时进行调整。 总之,确定值的截断点是一个复杂的问题,需要考虑多方素。...p值小于该领域内常用截断阈值,如基因组中常见的5E-08、1E-05 ---- 小结 在这篇推文中,我们讨论了以下几个问题: 如何检查自己机器的机器精度 R中p值小到什么程度会变成0 多大的数在R中计算有意义

    3.3K30

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

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

    50520

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

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

    55830

    java 中 BigDecimal 详解「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。 首先,学习一个东西,我们都必须要带着问题去学,这边我分为 【为什么?】【是什么?】【怎么用?】 【为什么要用BigDecimal?】...1、简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。...BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用 BigDecimal(long) 创建一个具有参数所指定长整数值的对象。...doubleValue() 将BigDecimal对象中的值以双精度数返回。...: ,这边我们要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数 divide(BigDecimal,保留小数点后几位小数,舍入模式) 舍入模式 ROUND_CEILING

    75420

    Python3 四舍五入问题详解

    本来一个简单的问题,为什么变得难以理解,难道是Python的round策略出了问题? 作为一个专业级语言平台,Python显然不会没有想到这样的问题。 其实,浮点数问题并非我们想象的那样简单。 二....对不能使用有限位二进制小数表示的十进制有限位小数,在系统中存储的是这些十进制浮点数的近似值。在近似值中,分为进位和截断两种类型,近似误差一般在${10}^{-17}$左右。...进位近似值大于原值,截断近似值小于原值,所以对小数位较小的数值(如1.215被进位,1.275被截断),进位近似值会出现尾部的增加值(上面说的尾部乱码),截断近似值小于原值,会出现”999......但用户给出的值首先要转换到双精度近似值,round的规则用于这个近似值四舍五入, 就要考虑精度范围。这个范围对float 来说,就是52位二进制存储精度,即十进制的17位小数有效位之内。...Python中存储的二进制双精度近似数。

    3.5K30

    盘点Excel中的那些有趣的“bug”

    经过测试在Excel中并不存在2100年2月29日,那为什么只有1900年这一天错了?...简而言之,计算机计算过程使用二进制,对于1.2-1.1的结果为2进制循环小数,在存储时会进行小数截断,导致出现误差。...对于所有操作计算都做两次ROUND过于繁琐,这里可以使用Excel提供的另一个设置,使用“显示精度”,这样Excel在存储计算时,会按照单元格设置的显示小数位数来保留精度。 ?...但是要注意,后续计算需要真实的计算结果还是格式化后的结果,不正确的使用这个功能可能会导致误差越来越大。 数字不计算 ?...总结 Excel中有很多这样并不是很符合日常行为的操作,以上只是葡萄城在研究Excel电子表格时遇到的其中一部分有趣的内容,相信大家也遇到过什么比较奇妙的计算错误,欢迎留言吐槽。

    89720

    0.57 * 100 === 56.99999999999999 之谜

    前言 在最近业务开发中, 作者偶遇到了一个与 JavaScript 浮点数相关的 Bug。 这里就简单描述下背景: 在提现相关业务时, 会将展示给用户以元为单位的数值转化为以分为单位的数值。...在JS中, 无论整数还是小数都是Number类型, 它的实现遵循IEEE 754, 是标准的Double双精度浮点数, 使用固定的64位来表示。 看到这里你可能就不想看下去了。...阅读完上面一节, 对小数的乘法我们也可以有一些自己的猜测了。 0.57这个数值在存储时, 本身的精度不是很准确, 我们用toPrecision这个方法可以获取小数的精度。...而此时, 路总问了我一个问题, 为什么0.57 * 1000 === 570 而不是 569.99999..., 不求甚解的我只能先回答"应该是精度丢失吧" 然而, 我"小小的眼睛里充满了大大的疑惑"....例如本文最初遇到的BUG const value = Math.round(0.57 * 100); 而我们不太确定精度的浮点数运算, 通用的解决方案都是将小数转化为整数, 进行计算后, 再转化为小数就好了

    1.4K10

    热点面试题:为什么 0.1+ 0.2 != 0.3,如何让其相等?

    前端小菜鸡一枚,分享的文章纯属个人见解,若有不正确或可待讨论点可随意评论,与各位同学一起学习~ 热点面试题:为什么 0.1+ 0.2 != 0.3,如何让其相等?...• 在开发过程中遇到类似这样的问题: let n1 = 0.1, n2 = 0.2; console.log(n1 + n2 === 0.3); // false -> 0.1 + 0.2 =...• 一般我们认为数字包括整数和小数,但是在 JavaScript 中只有一种数字类型:Number,它的实现遵循 IEEE 754 标准,使用 64 位固定长度来表示,也就是标准的 double 双精度浮点数...在二进制科学表示法中,双精度浮点数的小数部分最多只能保留 52 位,再加上前面的 1,其实就是保留 53 位有效数字,剩余的需要舍去,遵从“0 舍 1 入”的原则。...由于 JavaScript 的数字是双精度数,这里就以双精度数为例,它的指数部分为 11 位,能表示的范围就是 0~2047,IEEE 固定双精度数的偏移量为 1023。

    13010

    1.10乘100为什么不等于110

    “参数错误:你输入的金额格式不正确”,看着手机弹出的提示弹窗,大妈狠狠咬了牙,又重复了一遍上述的支付动作,“参数错误:你输入的金额格式不正确”。...他一次次发起1.10元支付测试,看着一次次弹出的反馈信息“参数错误:你输入的金额格式不正确”,他越觉得莫名奇妙,1.10乘100不就等于110吗,还有什么格式错误的?...IEEE754 双精度浮点数 Javascript 作为一门动态语言,其数字类型只有 number 一种。...nubmer 类型使用的就是美国电气电子工程师学会 IEEE754 标准中以64-bit存储的的双精度浮点。...而浮点数表示方式具有以下特点: 1.浮点数可表示的值范围比同等位数的整数表示方式的值范围要大得多; 2.浮点数无法精确表示其值范围内的所有数值,而有符号和无符号整数则是精确表示其值范围内的每个数值; 3

    37010

    范围和精度?那就是【表示不到】的意思啊!

    我是小二哥。 在上一篇文章中,我们又主要介绍了浮点数。今天,我们接着把浮点数的范围和精度问题弄清楚。...根据IEEE754 浮点数标准中的规定,我们可以计算出单精度浮点数和双精度浮点数的范围和精度。...此外,浮点数标准的规定,也造成了计算中精度丢失的问题。 计算机在表示一个数字时,宽度(可以理解为bit位)是有限的。...当有无限循环的小数(二进制无效循环)存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。...按照IEEE 754 标准的 64 位双精度浮点数,小数部分最多支持 53 位二进制位,之后的二进制位就会被截断。因此,计算机存储的0.2的二进制不是完整的,是有精度缺失的。 于是乎!

    23310

    MySQL支持的数据类型

    浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种,在mysql中以字符串的形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。...-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度...每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。 TIMESTAMP类型有专有的自动更新特性,将在后面描述。...它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。...这说明它们没有字符集,并且排序和比较基于列值字节的数值值。 BLOB 是一个二进制大对象,可以容纳可变数量的数据。

    1.6K30

    python格式化输出:f-string格式化输出

    大家好,我是黄同学 1、f-string简介   python3.6引入了一种新的字符串格式化方式:f-tring格式化字符串。...{ }可以填入表达式或调用函数,Python会求出其结果并填入返回的字符串内。...后面,直接加f,表示补足小数点后的位数至默认精度6 >>> f"{a:2f}" '123.456000' 2.8 f-string截断与填充的结合使用   当需要格式化的数据类型是“字符串”的时候,才会发生截断...截断的含义,以及发生截断的条件,都可以可参考我文章开头提到的文章。...>>> a = "Hello" # 当发生截断的时候,如果不指定填充符,默认使用空格填充 >>> f"{a:10.3}" 'Hel ' # 在发生截断的时候,使用指定的填充符 >>> f"{

    4.5K10

    数值信息的机器级存储

    ② 扩展与截断数字 这是一类在类型转换时会遇到的问题,我们在编程中常常会将「小范围」类型的变量转换为「大范围」类型的变量,或者将「大范围」类型的变量强制转换成「小范围」类型的变量。...下图是浮点数存储的标准格式,当然单双精度在各自的模块使用的位数不尽相同。...[image] IEEE 标准规定,单精度和双精度浮点数的存储格式如下: [image] 我们分几种情况来讨论这个浮点数的二进制存储。...但是这个「很大的正数」该如何取才能保证,无论原来的阶码有多小都能被转换成一个正数呢? IEEE 标准规定,单精度浮点数的这个 Bias 为 127,双精度的 Bias 为 1023 。...就目前而言,我也不能保证,懂得了计算机是如何存储数值的就一定能够提高你的编程能力,但是等到你程序中出现数值运算错误而无法解决的时候,这一点点基础知识一定能帮上忙。

    1.3K60

    公司同事用float和double,结果导致..

    float和double float 单精度浮点数在机内占 4 个字节,用 32 位二进制描述 double 双精度浮点数在机内占 8 个字节,用 64 位二进制描述 注意float型定义的数据末尾必须有...这个时候就有人问了,我定义 float 类型为 1.4 的时候为什么不是 1.399999999呢?这就是不进行浮点计算的时候,在十进制里浮点数能正确显示。...在存储的时候,float 和 double 都存在精度损失的问题,很可能在比较值的时候,得到不正确的 结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数并分开存储。...BigDecimal 要注意的东西 1.BigDecimal(double) 创建一个具有参数所指定双精度值的对象 但是这种类型是都不推荐使用的,为什么不推荐使用,我们来试一下 BigDecimal...这就是为什么有些面试官在面试基础的时候,很多次会问,float 和 double 都会丢失精度,BigDecimal 会丢失精度么?为什么?

    81840

    java 中对 BigDecimal 类使用详解

    只能无限接近于那个值 举例: 以上可以看出,两个小数相加,得到的值的精度缺失 2 BigDecimal是什么?...Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。...BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用 BigDecimal(long) 创建一个具有参数所指定长整数值的对象。...doubleValue() 将BigDecimal对象中的值以双精度数返回。 floatValue() 将BigDecimal对象中的值以单精度数返回。...: ,这边我们要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数 divide(BigDecimal,保留小数点后几位小数,舍入模式) 6.1 舍入模式 ROUND_CEILING

    1.2K30

    C语言printf()scanf()的转换说明和转换说明修饰符

    与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志。 调用格式: printf()函数的调用格式为:printf("格式化字符串",输出表列)。...abcdef,X对应的是ABCDEF(不输出前缀0x) printf("0x%x 0x%X",123,123);输出0x7b 0x7B f/lf float(double) 单精度浮点数用f,双精度浮点数用...注意指定精度,否则printf默认精确到小数点后六位(单精度是六位,双精度是八位) e/E float(double) 科学计数法,使用指数(Exponent)表示浮点数,此处”e”的大小写代表在输出时...因为相同类型可以有不同的长度,比如整型有16bits的short int,32bits的int,也有64bits的long int,浮点型有32bits的单精度float和64bits的双精度double...全缓冲与行缓冲的区别在于遇到换行符不刷新缓冲区。 printf在VC++中默认关闭缓冲区,且只能设置全缓冲。

    2.3K20
    领券