首页 > 数据库 >MySQL查询精度丢失、varchar与bigint之间隐式类型转换的问题

MySQL查询精度丢失、varchar与bigint之间隐式类型转换的问题

时间:2023-01-17 12:11:36浏览次数:52  
标签:类型转换 888890014000600010001 varchar 查询 bigint mysql 精度

数据库查询过滤失效。

今天在测试库上做一个关联查询时出现了捞出多余的值的情况,现在换个表名重现一下再解释。

做项目时遇到一个奇怪的问题,关于mysql查询精度会有所丢失的。

比如数据库字段存储为varchar,888890014000600010001,查询的时候就一定要加上单引号。

如:‘888890014000600010001’作为过滤的条件,如果不加单引号,只是where id =888890014000600010001,那么就会查出来多条记录,如:888890014000600000001也会被查出来。

mysql把bigint类型转到varchar时,精度丢失了,因为888890014000600010001远远大于了bigint的极限。

 

【原因】

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

 

 

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

标签:类型转换,888890014000600010001,varchar,查询,bigint,mysql,精度
From: https://www.cnblogs.com/ramsey/p/17057522.html

相关文章

  • 类型转换
    小容量可以自动转换为大容量,这种操作被称为:自动类型转换大容量转小容量,需要进行强制类型转换当一个整数赋值给一个char类型变量的时候,会自动转换成char字符型,最终的结果......
  • ORA-06502: PL/SQL: 'Numeric or Value Error' When CLOB Convert to VARCHAR2 on a M
    OnadatabasewithmultibytecharactersetlikeAL32UTF8specifiedforNLS_CHARACTERSETthefollowingerrorisreceivedwhenaCLOBwhichcontainsmorethan819......
  • C/C++显示类型转换的位拓展方式
    最近用verilator写模块的tb,在这里卡了好久(测半天都是C++写的问题)要点变量从小位宽到大位宽显示类型转换(explicitcast)时的位拓展方式,取决于转换前变量的符号性。倘若......
  • python教程6--自定义函数,数据类型转换,解方程
    本文主要讲解点如下:简单函数数据类型转换空函数自定义绝对值函数自定义函数检查参数类型函数返回多个值求解ax2+bx+c=0的根具体代码如下:'函数相关'__author__='mo......
  • C语言中类型转换的两种方式
    类型转换1.定义:不同类型的数据混合运算时需要进行类型转换(conversion),将不同类型的数据转换成相同类型的数据后再进行计算。2.分类:(1)隐式类型转换*编译系统自动进行转换。*在......
  • java基础05 类型转换
    类型转换知识点上一节讲到,字符的本质还是数,所以字符也可以进行运算运算中,先要将不同类型的数据转换为同一类型后,才能再进行运算,转换具有优先级低—————————......
  • 类型转换
    1publicclassDemo03{2publicstaticvoidmain(String[]args){3/*4*由于java是强类型语言,所以有时要用到类型转换5*低......
  • C++ 扩展的显示类型转换
      ......
  • 类型转换
    类型转换由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。低——————————————高byte,short,char-int-long-float-double运算中,不同类......
  • 棋盘放麦子 --------- 大整数(BigInteger详解)
    BigInteger类用java.math包中的BigInteger类的对象,可以使用构造方法publicBigInteger(Stringval)构造一个十进制的BigInteger对象。该构造方法可以发生NumberFormat......