因为后台所有表ID都是按照雪花算法生成的18位数字,需要对接到Android,Ios和H5,此时H5会出现字符超长溢出,所以直接把ID改为varchar类型。
如我的一张表ID为varchar(18)类型,此时下面两种查询会有不同的结果,查询where条件中不带引号和带引号
和
可以看出来,第二行查询结果是正确的。原因是当类型不长一致的时候,Mysql会自动做以下转化:
- 一个为TIMESTAMP或者是DATETIME,另一个为常量,常量会转化为TIMESTAMP,再进行比较
- 一个为DECIMAL或者是整数,整数会转化为DECIMAL,再进行比较
- 一个为整数,另一个为字符串,会都转化为浮点型,再进行比较
即发生了第三种情况的转化,但是整数为准确值,浮点数为精度值,浮点型存储结构是1个符号位,8个指数位,23个尾数,所以当位数超过7位的时候就会不精确,此时查询会出现问题。