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

标签 mysql sql search string-comparison

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

我有一个产品表、一个关键字表和一个连接表。为了让事情变得更简单,我使用了一个执行连接的 View ,为我提供了每个产品 ID 的关键字字符串的简单列表。特别是 1 个产品有 4 个关键字:“John”、“Deere”、“8000”、“Midroller”,这些关键字在 View 中以及加入时正确显示。

我遇到的问题是 (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

I've had a look at this: MySql: Compare 2 strings which are numbers? but it didn't really help.

I also found this MySQL Query doesn't seem to be outputting expectations but I'm trying trying to compare them as strings, not as numbers.

Even trying

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,因为在这个阶段我希望保持搜索相当的限制性。

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

最佳答案

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

您可以使用这样的查询找到所有这些“不良”记录

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 演示

关于Mysql 字符串和数字不相等/不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18394231/

相关文章:

java - 无法为连接 URL 创建类 'com.mysql.jdbc.Driver' 的 JDBC 驱动程序

mysql - Laravel Eloquent 模型按本地列和关系模型列值排序

mysql - 如何从另一个表和用户输入插入到一个表中?

sql - 计算特定范围sql server的记录数

swift - 提高搜索速度结果 - swift tableviewcontroller

PHP 在数组中搜索值

mysql - 字符串作为主键的性能损失?

sql - SELECT 子查询中的 ORACLE ORDER BY

sql - 你怎么能阻止 NHibernate(通过 ActiveRecord)添加 this_.到公式中的表名

linux - ftp 将更改的文件推送到服务器