2010-10-12 62 views
4

不同的結果產生由Hibernate查詢以下(除了我換成*字段列表):SQL查詢執行 - 在Windows和Linux

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 
      ) 
     ) 
    ) 

目前,我有200多個記錄Windows和Linux的數據庫,目前每個記錄,將發生以下情況是真實的: 活躍= 1 公佈= 1 resourcePublic = 1

當我直接在SQL客戶端運行這個,這個SQL查詢獲取我所有的匹配記錄在Windows上但沒有在Linux上。我在Windows和Linux上都安裝了MySQL 5.1。

如果我應用布爾邏輯(true和true和(true或whatever)),我期望結果是真實的。在Windows上確實如此,但在Linux上是錯誤的!

如果我修改查詢,如下,它可以在Windows和Linux:

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

因此,有關resourceOrganization條件只存在正在查詢帶來的Linux 0的結果和我預料既然它是第一部分是真的'或'條件的第二部分,結果應該是真實的。

任何想法爲什麼這兩個操作系統之間的行爲差​​異,以及爲什麼顯然應該在Linux上工作不!

在此先感謝!

+8

你100%肯定這是相對於其他的東西一個平臺的問題 - 編碼,用戶權限..... – 2010-10-12 17:38:50

+6

SQL是平臺無關的 - 這很可能是在數據之間的差異Windows與Linux的實例。以兩個mysqldumps,然後將Windows轉儲恢復到Linux實例並再次測試 - 應該像在Windows上一樣工作。 – 2010-10-12 17:46:32

+3

由於您正在使用'current_date()',請檢查兩個系統上的日期。它們是否同步?另外,請檢查你的客戶。某些客戶端不會將1和0轉換爲布爾值。 – 2010-10-12 18:08:41

回答

0

檢查CURRENT_DATE()返回在兩個plataforms相同的格式

0

也不要忘記檢查歸類和大小寫,如果一臺服務器使用不同的排序規則其他那麼你將有同樣的問題。

+0

我會建議相同的。 – Nishant 2011-01-09 10:09:20

0

我注意到第二個測試查詢只諮詢資源表而不是resourceOrganisation表。

我懷疑table 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 
    )