我的sql子句:
SELECT * FROM dev_userdb.ry_usercard where UserIdentity=610528194506235115
UserIdentity是varchar(64)的类型。当我执行查询时,结果不是我想要的,为什么?
答案 0 :(得分:6)
UserIdentity是varchar(64)的类型
然后,您的查询应使用您要查询的值周围的引号,例如
...userIdentity = '601528194506235115'
MySQL手册对equality comparisons的描述解释了获得结果的原因:
以下规则描述了比较操作的转换方式:
如果一个或两个参数为NULL,则比较结果为NULL,但NULL-safe< =>除外。平等比较运算符。对于NULL< => NULL,结果为true。无需转换。
如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
如果两个参数都是整数,则将它们作为整数进行比较。
如果不与数字进行比较,十六进制值将被视为二进制字符串。
如果其中一个参数是TIMESTAMP或DATETIME列而另一个参数是常量,则在执行比较之前将常量转换为时间戳。这样做是为了更友好的ODBC。请注意,这不是针对IN()的参数!为安全起见,在进行比较时始终使用完整的日期时间,日期或时间字符串。例如,要在将BETWEEN与日期或时间值一起使用时获得最佳结果,请使用CAST()将值显式转换为所需的数据类型。
一个或多个表中的单行子查询不被视为常量。例如,如果子查询返回要与DATETIME值进行比较的整数,则比较将作为两个整数完成。整数不会转换为时间值。要将操作数作为DATETIME值进行比较,请使用CAST()将子查询值显式转换为DATETIME。
如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另一个参数是浮点值,则将参数作为浮点值进行比较。
在所有其他情况下,将参数作为浮点(实数)进行比较。
您的比较最终使用该lat规则,即浮点数比较。
MySQL使用的floating-point numbers是IEEE-754单精度(" float")或双精度(" double")二进制浮点数;可能是因为上面使用了双打(你认为他们会这么说)。
IEEE-754双精度二进制浮点只有十五位精度的大约15位数。具体来说,只能表示一些大于9007199254740992的整数(例如9007199254740993不能); 601528194506235115正好处于可表示整数之间存在较大间隙的范围内。如果您尝试以双精度存储601528194506235115,您获得的值是601528194506235100;这也是当你尝试在双打中存储601528194506235117和601528194506235118时得到的结果。因此,在'601528194506235117'
,'601528194506235118'
和601528194506235115
全部转换为双打后,为了在查询中对它们进行比较,它们全部为601528194506235100,所以它们都是全部等于。 (FWIW,601528194506235100之后的下一个可表示的整数是601528194506235300。)
JavaScript的数字也是双倍的,所以我们可以在网站上看到使用JavaScript的效果:
var table = [
'42',
'754',
'601528194506235117',
'601528194506235118',
'27'
];
var matches = table.filter(function(num) {
return +num === 601528194506235115;
});
console.log("matching entries:");
console.log(matches);

答案 1 :(得分:0)
UserIdentity类型是varchar(64),因此您应该在值周围使用引号。
select * from table_name where UserIdentity = 'value';