【问题标题】:SQL query execution - different outcomes on Windows and LinuxSQL 查询执行 - Windows 和 Linux 上的不同结果
【发布时间】:2011-04-24 11:10:33
【问题描述】:

以下是从 Hibernate 生成的查询(除了我用 * 替换了字段列表):

select *
from
    resource resource0_,
    resourceOrganization resourceor1_ 
where
    resource0_.active=1 
    and resource0_.published=1 
    and (
        resource0_.resourcePublic=1 
        or resourceor1_.resource_id=resource0_.id 
        and resourceor1_.organization_id=2 
        and (
            resourceor1_.resource_id=resource0_.id 
            and resourceor1_.forever=1 
            or resourceor1_.resource_id=resource0_.id 
            and (
                current_date between resourceor1_.startDate and resourceor1_.endDate
            )
        )
    )

目前我在 Windows 和 Linux 数据库中都有 200 多条记录,目前对于每条记录,以下情况恰好是正确的: 活跃 = 1 发表 = 1 资源公共 = 1

当我直接在 SQL 客户端中运行它时,这个 SQL 查询会在 Windows 上为我获取所有匹配的记录,但在 Linux 上却没有。我在 Windows 和 Linux 上都有 MySQL 5.1。

如果我应用布尔逻辑,(真和真和(真或其他)),我希望结果为真。在 Windows 上确实如此,但在 Linux 上却是错误的!!!

如果我将查询修改如下,它可以在 Windows 和 Linux 上运行:

select *
from
    resource resource0_
where
    resource0_.active=1 
    and resource0_.published=1 
    and (
        resource0_.resourcePublic=1 
    )

因此,仅存在与 resourceOrganization 相关的条件就会使查询在 Linux 上带来 0 结果,我预计由于它是第一部分为真的“或”条件的第二部分,结果应该为真。

知道为什么 2 个操作系统之间的这种行为差异以及为什么显然应该在 Linux 上工作的东西没有!

提前致谢!

【问题讨论】:

  • 您是否 100% 确定这是一个平台问题,而不是其他问题 - 编码、用户权限.....
  • SQL 与平台无关——这很可能是 Windows 与 Linux 上的实例之间的数据差异。获取两者的 mysqldumps,然后将 Windows 转储恢复到 Linux 实例并再次测试——应该像在 Windows 上一样工作。
  • 由于您使用的是current_date(),请检查两个系统上的日期。他们同步吗?另外,检查您的客户。一些客户端不会将 1 和 0 转换为布尔值。
  • 请停止使用隐含的连接语法。它容易出错(意外交叉连接)更难维护(这是故意的交叉连接还是错误?现在我需要左连接,我该怎么办,提示不要将隐式和显式混合在一起相同的查询))和非常糟糕的编程技术。看在上帝的份上,它自 1992 年以来也已过时,2010 年没有任何借口使用它。
  • 选择 * 也是一种糟糕的技术。它会产生维护问题并浪费资源。由于您有一个连接,因此您至少返回了两列具有相同数据的列,浪费、浪费、浪费。您不应该在生产代码中使用 select *。

标签: mysql sql windows linux


【解决方案1】:

【讨论】:

    【解决方案2】:

    检查 current_date() 是否在两个平台中返回相同的格式

    【讨论】:

      【解决方案3】:

      我注意到第二个测试查询只查询资源表而不是 resourceOrganisation 表。

      我怀疑表 resourceOrganisation 在两台机器上的填充方式不同,并且您的 Linux MySQL 中可能不存在相应的行。

      这个查询返回什么?

      select *
      from
          resource resource0_,
          resourceOrganization resourceor1_ 
      where
          resource0_.active=1 
          and resource0_.published=1 
          and (
              resource0_.resourcePublic=1 
              or resourceor1_.resource_id=resource0_.id 
              and resourceor1_.organization_id=2 
          )
      

      【讨论】:

        【解决方案4】:

        另外不要忘记检查排序规则和区分大小写,如果一个服务器使用与另一个不同的排序规则,那么您将遇到同样的问题。

        【讨论】:

          猜你喜欢
          • 2016-05-03
          • 2015-09-15
          • 2018-07-06
          • 1970-01-01
          • 1970-01-01
          • 2018-01-10
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多