选择连接输出不完全匹配[MySQL]

选择连接输出不完全匹配[MySQL],mysql,select,join,Mysql,Select,Join,有人能解释一下为什么这个问题: 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%匹配,因此只能显示

有人能解释一下为什么这个问题:

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%匹配,因此只能显示第一行。如果有人能解释为什么会这样,那就太好了。

原因很可能是隐式类型转换。我猜
id
字段是
integer
类型,而
reference
字段是
varchar
类型。因此,在比较MySQL时,会将
varchar
转换为一个数字。因此,例如,将值
'10299a'
转换为
10299
,然后与
id
字段的相应值进行比较


原因很可能是隐式类型转换。我猜
id
字段是
integer
类型,而
reference
字段是
varchar
类型。因此,在比较MySQL时,会将
varchar
转换为一个数字。因此,例如,将值
'10299a'
转换为
10299
,然后与
id
字段的相应值进行比较


显然,rma.id列是数字(整数),而引用字段是文本字段,因为它也包含文本

正如上的MySQL文档所描述的,如果将文本与数字进行比较,则比较结果为一个浮点数,这意味着引用字段将转换为一个数字

MySQL通过从左到右计算字符串的字符,将字符串转换为数字,前提是可以将特许状解释为数字。如果遇到无法作为数字计算的字符,MySQL将停止计算并返回前面的字符作为数值

对于第二条记录,字母
a
是不能作为数字计算的第一个字符,因此
'102299a'
字符串的数值为
102299
。同样的逻辑也适用于第三条记录


要强制MySQL仅返回精确匹配,请使用查询中的函数将
rma.id
显式转换为字符串。这样,比较将作为字符串而不是浮点数进行。

显然,rma.id列是数字(整数),而引用字段是文本字段,因为它也包含文本

正如上的MySQL文档所描述的,如果将文本与数字进行比较,则比较结果为一个浮点数,这意味着引用字段将转换为一个数字

MySQL通过从左到右计算字符串的字符,将字符串转换为数字,前提是可以将特许状解释为数字。如果遇到无法作为数字计算的字符,MySQL将停止计算并返回前面的字符作为数值

对于第二条记录,字母
a
是不能作为数字计算的第一个字符,因此
'102299a'
字符串的数值为
102299
。同样的逻辑也适用于第三条记录


要强制MySQL仅返回精确匹配,请使用查询中的函数将
rma.id
显式转换为字符串。这样,比较将作为字符串而不是浮点数进行。

隐式数据类型转换

我怀疑
id
列被声明为数值数据类型。很可能是
INT

reference
列被声明为字符类型。很可能是
VARCHAR

为了进行相等比较,MySQL不能将“字符串”与“数字”进行比较

所以MySQL隐式地将字符串值转换为数字,然后比较数值

如果字符串不是有效数字,其他数据库将抛出错误

但是MySQL允许转换(没有错误或警告)

作为演示,这些表达式使MySQL将字符串隐式转换为数字:

SELECT '123ABC' + 0 
     , '4D5E6F' + 0 
     , 'G7H8I9' + 0

例如,考虑到你的价值观

SELECT '100316AFEN1' + 0 
我们看到MySQL返回一个100316的数值,用于比较


隐式数据类型转换

我怀疑
id
列被声明为数值数据类型。很可能是
INT

reference
列被声明为字符类型。很可能是
VARCHAR

为了进行相等比较,MySQL不能将“字符串”与“数字”进行比较

所以MySQL隐式地将字符串值转换为数字,然后比较数值

如果字符串不是有效数字,其他数据库将抛出错误

但是MySQL允许转换(没有错误或警告)

作为演示,这些表达式使MySQL将字符串隐式转换为数字:

SELECT '123ABC' + 0 
     , '4D5E6F' + 0 
     , 'G7H8I9' + 0

例如,考虑到你的价值观

SELECT '100316AFEN1' + 0 
我们看到MySQL返回一个100316的数值,用于比较



那么我如何才能100%匹配它呢?MySQL将字符串转换为浮点数,而不是int@arti您必须将
id
转换为
varchar
@Shadow谢谢您的评论,我已经编辑了我的答案。那么我如何才能100%匹配它呢?MySQL将字符串转换为浮点数,而不是int@arti你必须将
id
转换为
varchar
@Shadow谢谢你的评论,我已经编辑了我的答案。谢谢你的解释,cast(rma.id as char)完成了任务!感谢您的解释,cast(rma.id作为char)完成了这项工作!