MySQL中SnakeFlake ID查询匹配异常问题求助
问题原因解析
当id列类型为varchar(32)时,执行sql1这类字符串列与数值直接比较的语句,MySQL会触发隐式类型转换:自动把id列的字符串值转换成数值类型,再和右侧的数值做比较。
问题的核心在于浮点数精度丢失:
- 你的两个ID值
1768475217040121858和1768475217040121859都是远超2^53(约9007199254740992)的超大整数。MySQL在隐式转换这类超大字符串为数值时,会使用DOUBLE类型存储转换结果。 DOUBLE类型的有效精度只有53位,超过这个范围的整数无法被精确表示——相邻的超大整数会被舍入成同一个DOUBLE值。这就导致'1768475217040121858'和'1768475217040121859'转成DOUBLE后数值完全相同,所以用数值1768475217040121858比较时,两行数据都会被匹配到。
而执行sql2时是字符串与字符串直接比较,不会触发隐式转换,MySQL会按字符逐个精确匹配,因此只会返回第一行数据。
当你把id列改回bigint(20)后,列类型与右侧数值类型一致,直接进行整数精确比较,就能正确匹配到唯一的目标行。
内容的提问来源于stack exchange,提问作者dogify
相关产品推荐
相关产品推荐

