任何人都可以解释为什么查询:
select rma.id, history_transactions.reference
from history_transactions
join rma on history_transactions.reference = rma.id
返回:
id | reference
100144 | 100144
102299 | 102299a
100316 | 100316AFEN1
不能让它只显示100%匹配,所以只有第一行。如果有人能够解释它为什么会发生,那就太好了。
答案 0 :(得分:2)
显然rma.id列是数字(整数),而引用字段是文本的,因为它也包含文本。
正如Type Conversion in Expression Evaluation上的MySQL文档所述,如果将文本与数字进行比较,则比较为浮点数,这意味着参考字段将转换为数字。
MySQL通过从左到右评估字符串将字符串转换为数字,只要章程可以解释为数字。如果遇到无法作为数字计算的字符,则MySQL停止评估并返回前面的字符作为数值。
如果是第二条记录,则字母a
是第一个无法评估为数字的字符,因此'102299a'
字符串的数值为102299
。同样的逻辑适用于第3条记录。
要强制MySQL仅返回完全匹配,请使用查询中的cast() or convert()函数将rma.id
显式转换为字符串。这样,比较将以字符串形式完成,而不是浮点数。
答案 1 :(得分:1)
原因很可能是隐式类型转换。我的猜测是id
字段属于integer
类型,而reference
字段属于varchar
类型。因此,比较MySQL将varchar
转换为数字。所以,例如值'10299a'
转换为10299
,然后与id
字段的对应值进行比较。
答案 2 :(得分:0)
隐式数据类型转换。
我怀疑id
列被声明为numeric数据类型。最有可能是INT
。
reference
列声明为字符类型。最有可能是VARCHAR
。
要进行相等比较,MySQL无法将“字符串”与“数字”进行比较。
所以MySQL隐含地将字符串值转换为数字,然后进行数值的比较。
如果字符串不是有效数字,其他数据库会抛出错误。
但是MySQL允许转换(没有错误或警告。)
作为演示,这些表达式会导致MySQL将字符串隐式转换为数字:
SELECT '123ABC' + 0
, '4D5E6F' + 0
, 'G7H8I9' + 0
根据您的值,例如
SELECT '100316AFEN1' + 0
我们看到MySQL返回一个用于比较的数值100316。