Mysql字符串和数字不相等/匹配

时间:2013-08-23 03:27:27

标签: mysql sql search string-comparison

我一直在尝试在mysql中编写一个简单的关键字比较查询,但由于某种原因,所有数字关键字都不匹配所有数字搜索词。

我有一个产品表,一个关键字表和连接表。为了简化操作,我使用了一个执行连接的视图,为每个产品ID提供了一个简单的关键字字符串列表。 1个产品特别有4个关键字,“John”,“Deere”,“8000”,“Midroller”,这些关键字在视图中和加入时正确显示。

我遇到问题的地方是(keyword =“8000”)对于“8000”关键字永远不会成立。

示例

SELECT a.id, kw.keyword AS keyword, (kw.keyword = 'John' OR 
  kw.keyword = 'Deere' OR 
  kw.keyword = "8000" OR 
  kw.keyword = 'Midroller') AS matched
FROM `kc5n2_product` AS a
INNER JOIN `product_keywords` AS kw ON a.id = kw.product
WHERE a.id =119

返回

 id    keyword    matches
119    8000       0
119    John       1
119    Deere      1
119    Midroller  1

我看过这个: MySql: Compare 2 strings which are numbers? 但它并没有真正帮助。

我也发现了这个MySQL Query doesn't seem to be outputting expectations,但我正在尝试将它们作为字符串进行比较,而不是数字。

即使尝试

SELECT a.id, kw.keyword AS keyword, (CAST(kw.keyword as Char(4)) = CAST("8000" as Char(4))) AS matched

尝试强制mysql将它们解释为字符串根本没有帮助。

如果我使用

,我发现它会匹配搜索字词
kw.keyword LIKE "%8000%"

但我宁愿避免LIKE,如果我能够在这个阶段我想保持搜索相当严格。

有什么明显的事我做错了吗?

2 个答案:

答案 0 :(得分:1)

在这种情况下,通常意味着您的“行为不端”值中包含前导/尾随空格。

你可以通过像这样的查询找到所有这些“坏”记录

SELECT *
  FROM keywords
 WHERE CHAR_LENGTH(keyword) <> CHAR_LENGTH(TRIM(keyword))

这是 SQLFiddle 演示

你可以通过像这样的简单更新来明确修复它们

UPDATE keywords
   SET keyword = TRIM(keyword)
 WHERE CHAR_LENGTH(keyword) <> CHAR_LENGTH(TRIM(keyword))

这是 SQLFiddle 演示

答案 1 :(得分:0)

我发布的内容没有任何错误。我设置了一个测试用例:

CREATE TABLE product (id INT);
CREATE TABLE product_keywords (product INT, keyword VARCHAR(32));

INSERT INTO product
  VALUES (19),(20);
INSERT INTO product_keywords 
  VALUES (19,'Foo'),(19,'John'),(19,'Deere'),(19,'8000'),(19,'Midroller');

SELECT a.id
     , kw.keyword AS keyword
     , ( kw.keyword = 'John' OR 
         kw.keyword = 'Deere' OR 
         kw.keyword = "8000" OR 
         kw.keyword = 'Midroller'
       ) AS matched
  FROM `product` a 
  JOIN `product_keywords` kw 
    ON a.id = kw.product
 WHERE a.id = 19

    id  keyword    matched  
------  ---------  -------
    19  Foo              0
    19  John             1
    19  Deere            1
    19  8000             1
    19  Midroller        1
它对我来说很好看。 (我在8000字面而不是双引号周围使用单引号,但在默认的MySQL配置中,它没有什么区别。)

在您的查看查询中可能存在问题。

此查询返回什么内容?

SELECT kw.* FROM product_keywords kw WHERE kw.product = 119 ORDER BY kw.keyword ;