• mysql varchar和bigint比较的坑


    问题描述:

    做两表关联时,有个比较,bigint和varchar 结果报错’Data truncation: Truncated incorrect DOUBLE value’,大多数问题出现是制表时不规范,类型没有统一,或者是子表查询出来的字段会默认是varchar;还有就是在查询时会出现精度负优化,搞得找问题是各种迷。在插入语句中出现,会有这个类型报错提示,查询时就没有,直接通过!

    大致就是:
    select 165933842860300000003 = '165933842860300000004'; 这个sql返回的结果就是1,认为条件成立,这个查询出来就会出现各种奇葩的问题```
    
    • 1

    如:
    在这里插入图片描述

    select 165933842860300000003 = 165933842860300000004;返回的结果就是0,条件不成立
    
    • 1

    这个是mysql做的兼容性的操作

    MySQL在比较字符串和数值时,会将两者都转换成双精度浮点数进行比较,因为精度丢失,导致比较结果为true

    详细介绍:

    出现上面问题的原因是:在MySQL中当我们对不同类型的值进行比较的时候,为了使得这些数值可比较(也可以称为类型的兼容性),MySQL
    会做一些隐式转换(Implicit type conversion) //
    MySQL官方文档中有一篇介绍关于比较函数与运算符的文档。其中写到, Strings are automatically converted
    to numbers and numbers to strings as necessary. 意思是必要时字符串和数字之间会互相转换。
    // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html

    解决方案:

    1、统一字段类型,用bigint就都用bigint,用varchar都用varchar。这样不仅规范,而且可以避免两表联查时索引失效;
    2、查询语句的条件中严格按照字段的类型写查询值。避免mysql进行隐式转换。也同时可以避免索引失效;
    3、统一查询比较时的类型,使用mysql提供的CAST()函数,或者各种字符串函数处理。

  • 相关阅读:
    c++实现多层汉诺塔问题(信息素养大赛复赛)
    混乱是阶梯:Web2与Web3的融合,也是COSO的窗口期
    C++修炼之路之多态---多态的原理(虚函数表)
    【Harmony OS】【JAVA UI】abilitySlice和ability跳转方式
    AI学习教程:AI(Adobe lliustrator)快速入门
    MS5228数模转换器可pin对pin兼容AD5628
    package.json文件的一些知识点,实践总结
    如何生成SSH服务器的ed25519公钥SHA256指纹
    蓝桥杯C++AB算法辅导
    AWS DynamoDB使用
  • 原文地址:https://blog.csdn.net/qq_42448606/article/details/126578663