简单的MySQL加入varchar(100)字段不起作用

时间:2013-05-13 23:08:03

标签: mysql

所以,我正在加入mysql来过滤掉一些不好的数据,我遇到了这个奇怪的问题。

  • 两个表都由payment_transaction_id连接。
  • 它们都具有值3463
  • 联接结果不返回任何行。
  • 两个表都有此值。

证明记录在card_transaction_log中:

select count(*)
from card_transaction_log 
where payment_transaction_id = 3463;
>> 1

证明记录在交易中:

select count(*)
from transaction 
where payment_transaction_id = 3463;
>> 1

但是加入不起作用。

select count(*)
from card_transaction_log a, transaction b
where a.payment_transaction_id = b.payment_transaction_id
and a.payment_transaction_id = 3463;
>> 0

老实说,我以前从未在mysql中见过这样的东西。我甚至和我的同事核实过,以确保我不会疯狂和/或愚蠢。

更新

虽然这与上面相同,但此查询也不起作用:

select count(*)
from card_transaction_log a
join transaction b
on a.payment_transaction_id = b.payment_transaction_id
where a.payment_transaction_id = 3463;
>> 0

4 个答案:

答案 0 :(得分:7)

payment_transaction_id是什么类型的?我怀疑它不是INT而是VARCHAR。 如果您尝试将VARCHAR与INT进行比较,MySQL会自动将其转换为INT,但可能会发生一些奇怪的事情,例如:

'3463' = 3463

但也

'3463a' = 3463

'3463a' != '3463b'

请参阅小提琴here。您可以像这样测试您的查询:

select count(*)
from card_transaction_log 
where payment_transaction_id = '3463';

并且我怀疑至少有一个查询会返回0.或者您可以强制您的联接使用整数值:

select count(*)
from card_transaction_log a
join transaction b
on a.payment_transaction_id+0 = b.payment_transaction_id+0
where a.payment_transaction_id = 3463;

答案 1 :(得分:0)

你可以尝试:

select count(*)
from card_transaction_log a
join transaction b
on a.payment_transaction_id = b.payment_transaction_id
where a.payment_transaction_id = 5081483008;

答案 2 :(得分:0)

我今天遇到了同样的麻烦,这就是我发现的。即使表A上的SQL选择和表B上的SQL选择显示主键和外键的值相等,但值实际上是不同的... a'\ n',当值显示在表中时未显示一个网格,是我所有外键值的结束字符...... 根本原因,我没注意我用来通过'import'填充表格的文件是在互联网上找到的损坏的CSV文件。

您可以进行快速测试,只需手动更新一些预期加入的外键和主键值,然后再次测试您的查询。如果它返回结果,你找到了根本原因!

答案 3 :(得分:0)

在我看来,这是因为数据中存在隐藏字符。

我使用以下命令导入了包含电子邮件列表的CSV文件:

LOAD DATA INFILE 'c:/temp/users.csv' 
INTO TABLE cloudusers 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 0 ROWS;

因此,每个VARCHAR的末尾都有一个返回字符。 字符串看起来相同,但不同。

当我重新导入时使用

LOAD DATA INFILE 'c:/temp/users.csv' 
INTO TABLE cloudusers 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 ROWS;

(请注意使用“ \ r \ n”而不是“ \ n”) 生成的VARCHAR随后匹配,并且所有联接都起作用。