选择连接输出不完全匹配[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)完成了这项工作!