【问题标题】:Mysql returning empty set when data is there当数据存在时,Mysql返回空集
【发布时间】:2011-11-18 21:19:47
【问题描述】:

我有一个包含列的简单位置表:location_id, country, state, city

我用数据填充了表格并运行了以下查询:

SELECT location_id 
FROM locations 
WHERE country="United States" 
AND state="Louisiana" 
AND city="New Orleans";

即使数据存在,MySQL 也会返回一个空集。我已将其隔离到城市列。如果我在 WHERE 子句中去掉城市条件,一切都很好。如果我在 SELECT 子句中询问城市但不在 WHERE 子句中,一切都很好。可能是什么问题呢?这个查询似乎太简单了,不会造成麻烦。

城市列中的空白是否会导致这种情况?

更新!更新!

谢谢大家 - 我解决了这个问题。 我从文本文件中输入了城市列数据,每个城市名称都在一行上。这让我想知道换行符。我运行了查询(SELECT location_id FROM locations WHERE state="Louisiana" AND city="New Orleans\n")。像魅力一样工作。

我通过运行以下查询清除了列中的所有换行符: 更新locations SET city = REPLACE(REPLACE(city, '\r', ''), '\n', '');

一切正常,我学会了使用文本文件填充数据库的技巧。

感谢大家帮助我解决这个奇怪的问题。

【问题讨论】:

  • 您可以选择 * 并包含有问题的结果吗?
  • 你能输出你找不到的行的SQL结果吗? SELECT CONCAT('"', location_id, '"') AS location_id, CONCAT('"', country, '"') AS 国家, CONCAT('"', state, '"') AS state, CONCAT('" ', city, '"') AS city FROM locations;
  • 你能添加创建表格和插入数据的脚本吗?
  • 您应该发布您的解决方案作为答案并接受它,而不是编辑您的问题。这样它就会显示为已解决,其他人将能够更轻松地找到解决方案。

标签: mysql


【解决方案1】:

这可能不是空白;美国也是两个字。我会浏览表格以查找拼写错误或其他拼写错误。

您可以确保前导或尾随空格没有问题,或者像这样的大写:

SELECT location_id
FROM locations
WHERE lcase(trim(country))="united states"
AND lcase(trim(state))="louisiana"
AND lcase(trim((city))="new orleans"

【讨论】:

  • 如果“New Orleans”来自网络表单,则在 = 的两侧添加 lcase 和 trim。像这样lcase(trim((city))=lcase(trim(<web form data>))
【解决方案2】:

城市是否等于“新奥尔良”?或者有空间吗?还是大小写问题?试试

trim(city) like 'new orleans'

【讨论】:

  • 不建议在 MySQL 中进行双通配符搜索,因为它会强制 MySQL 引擎忽略所有索引。
  • 修剪功能无效,即使我在所有 WHERE 值上都使用了它。 Select * 返回所有内容,包括城市。我检查了我的数据。一切都拼写正确,没有空格。我多年来一直在做 mysql,从来没有遇到过这么简单的情况。感谢大家的快速回复。
【解决方案3】:

我猜 city 列可能在列的数据中有某种额外的空间,而您的排序规则在某种程度上影响了这一点。尝试做:

SELECT location_id 
FROM locations 
WHERE country="United States" 
AND state="Louisiana" 
AND trim(city)="New Orleans";

【讨论】:

    【解决方案4】:

    试试:

    SELECT location_id 
    FROM locations 
    WHERE country="United States" 
    AND state="Louisiana" 
    AND city LIKE "New Orleans%";
    

    【讨论】:

    • 这行得通,但似乎我不应该使用 LIKE 来让这个查询工作。一定有什么地方不对劲。另外我只想返回 1 行。一些城镇名称出现在多个州。
    • city 字段的末尾可能有多余的数据,这就是为什么它没有出现完全匹配的原因。您可以对替换 city = trim(city) 的所有字段进行更新
    • city 是 char 而不是 varchar?
    • Trim 绝对可能是这里更好的解决方案,除非问题是数据类型问题。
    【解决方案5】:

    尝试使用单引号而不是双引号。 '新奥尔良'

    【讨论】:

      猜你喜欢
      • 2020-05-29
      • 1970-01-01
      • 2020-06-23
      • 2022-12-22
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2014-03-04
      相关资源
      最近更新 更多