我遇到了一個非常奇怪的問題。除了駐留在默認(「PUBLIC」)模式中的所有表格外,我還有一個在單獨的模式中創建的表格(有這樣一個有效的商業理由,但這裏沒有關係)。當我跑從不同模式的表格中選擇「找不到列」
select * from schema1.table1
一切正常。如果我試圖做到這一點,但明確提及列名稱,例如
select col1, col2 from schema1.table1
查詢失敗,並顯示「Column col1 not found; 42S22/42122」錯誤。只要在select中的任何位置引用該列(從子句/ where子句/ etc ...)就會發生這種情況。
列名稱正確,它們顯示在INFORMATION_SCHEMA
中。此外,如果我引用它們,查詢可以正常工作 - 但是這會產生一個副作用,使列名區分大小寫,然後在Hibernate中失敗,這顯然無論如何都會將它們大寫。
我可以忽略一些明顯的東西嗎?是否有這種奇怪的行爲的原因或這是一個錯誤?
更新:托馬斯的回答讓我意識到問題不在於不同的模式,而在於如何創建該模式中的表;特別是使用帶引號的標識符。下面是再現了H2 1.3.161問題(最新版本ATM)的腳本:
create table table1(col1 int, "col2" int);
insert into table1 values(1, 1);
select * from table1; -- works
select col1 from table1; -- works
select "col2" from table1; -- works
select col2 from table1; -- fails
我不明白爲什麼還有最後2個查詢之間的差別。列名在這裏區分大小寫(因爲它是通過帶引號的標識符定義的),但它確實具有正確的大小寫。 INFORMATION_SCHEMA
。 COLUMNS
顯示兩列之間沒有區別(除名稱)。是否通過強制大寫所有查詢來獲取未引用列的大小寫不敏感?
上述腳本按預期工作(如在所有查詢中成功完成)在Postgres中。
「數據庫」是通用的 - h2是一個特定的數據庫,這就是爲什麼我通常在與mysql,oracle等結合使用時刪除標籤的原因。我忘了添加sql標記... –
@OMG Ponies - 「database」is通用的,但它也有更多的用戶。雖然這看起來確實是一個特定於H2的問題,但有人可能在另一個數據庫中遇到過類似問題。感謝您添加「sql」 - 我沒有想到這一點。 – ChssPly76