2017-05-10 58 views
0

我編寫了一個與某些數據庫引擎(例如MySQL,PostgreSQL)互操作的scala程序。使用JDBC創建表查詢不適用於不同的數據庫引擎

我使用JDBC API來處理SQL查詢。我使用查詢來創建表,並且我想創建一個包含用戶提供的字段的表,然後這些字段是可以包含空格或帶有口音的單詞的名稱。

例如,創建一個表虛設用2個場,'列1''列2'爲varchar字段。

寫這個查詢MySQL數據庫,同時保持包含在田裏的空間,我們需要像查詢中使用反引號:

CREATE TABLE dummy (`column 1` varchar(20), `column 2` varchar(20)); 

以同樣的方式,正確的方式來寫這個查詢的PostgreSQL同時保留空格爲:

CREATE TABLE dummy ("column 1" varchar(20), "column 2" varchar(20)); 

也許對於其他數據庫引擎,有不同的方法來編寫此查詢。

是否有任何標準的方式來編寫這個查詢與上面的constrainsts和使用JDBC,以便它可以與任何數據庫引擎一起使用?

預先感謝您的回答。

+0

您可以考慮使用像Hibernate這樣的ORM工具,它將處理語法中某些數據庫特定的細微差別。 –

+2

不,但處理空間我列名和區分大小寫的名字,是一場噩夢。我只是禁止這一點。或者用下劃線替換空格。 –

回答

1

這並不直接解決您提出的問題,但我認爲您最好不要這樣命名您的列。我會'標準化'列名稱(通過,例如用下劃線替換空格)。

列名應該不會直接暴露給用戶。 如果您需要列的「人類可讀」名稱,我會將它們存儲在另一個表中。或者,如果它像保留空格一樣簡單,只需將該過程顛倒過來,用空格替換下劃線。

0

如前所述,不應將空格,特殊字符或保留字用作列名或表名。爲了安全起見,您通常可以圍繞表名和列名加上引號,以避免跨數據庫的大小寫敏感問題。

CREATE TABLE "foo" ("id" VARCHAR(32), "bar" VARCHAR(64)) 

根據SQL-99標準的雙引號(「)用於界定標識符。案例sensitivy實際上涉及到使用的數據庫的類型和它的設置。有DBS將大寫或小寫您的桌子和如果他們沒有報價列名,但有時只在CREATE TABLEALTER TABLE命令。這可能會導致運行錯誤。

例如CREATE TABLE foo實際上可能會創建一個名爲FOO表。當執行SELECT * FROM foo你可能會得到一個錯誤,因爲表foo不存在,但表FOO確實存在ng在大量DBMS中工作我傾向於使用表名和列名引號。

的重要組成部分,是,你必須使用引號時,因爲"foo"不等於"FOO"而是取決於所使用的DBMS foo可能等於FOO堅持寫大寫或小寫。要麼使用小寫或大寫,而要使用引號。

您還應該避免使用數據庫特定的列類型(儘可能使用ANSI SQL)。

但是手工做數據庫遷移非常繁瑣且容易出錯。我會建議使用遷移工具(flyway db)或讓遷移由像slick這樣的庫創建。

正如你所提到的scala,請看看Slick(http://slick.lightbend.com/)這是一個功能強大的scala數據庫層。還有其他人,但我用了很多,可以推薦它。

+0

不,引用您的表,列和其他標識符的名稱會創建大小寫敏感的問題,而不是避免它們。 –

+0

我已經更新了有關您評論的答案。 – jan0sch

相關問題