2012-05-07 58 views
1

我有一個Informix 11.70數據庫。我無法在表上成功執行此插入語句。插入包含新行和引號的文本列的錯誤

INSERT INTO some_table(
    col1, 
    col2, 
    text_col, 
    col3) 
VALUES(
    5, 
    50, 
    CAST('"id","title1","title2" 
"row1","some data","some other data" 
"row2","some data","some other"' AS TEXT), 
    3); 

我收到的錯誤是:

[錯誤代碼:-9634,SQL狀態:IX000]從焦炭沒有強制轉換爲文本。

我發現,我應該爲了讓使用文本文字新行添加這種說法,所以我說這個我已經寫了同樣的查詢上面:

EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('t'); 

不過,我收到同樣的錯誤。

我也讀過IBM文檔說:或者允許換行,我可以在ONCONFIG文件中設置ALLOW_NEWLINE參數。我想最後一個需要管理員訪問服務器來改變那個我沒有的配置文件,我不想利用這個設置。

回答

0

我忘了在問題中提到一個重要的細節 - 我使用Java和Hibernate的ORM訪問我的Informix數據庫,因此,一些建議的方法(在loc_t處理尤其是)在Jonathan Leffler's answer是不幸的是不適用的。另外,我需要存儲動態長度的大數據,我擔心LVARCHAR列不足以支持它。

我得到它的方式是遵循Michał Niklas的建議from his comment,並使用PreparedStatement。這可能可以通過Informix以自己的方式處理TEXT數據類型來解釋。

3

Informix的TEXT(和BYTE)列會預先標記任何標準,並且在很多方面都是非常特殊的類型。 Informix中的TEXT與其他DBMS中的TEXT非常不同。長期以來(超過20年)的問題之一是沒有可用於向其中插入數據的字符串文字符號。 '不從字符轉換爲文本'是說沒有從字符串文字到TEXT的顯式轉換。

你有多種選擇:

  • 使用LVARCHAR在表(好,如果你的價值觀也不會超過幾昆明植物研究所長,因爲總的行長度約爲32昆明植物研究所)。 LVARCHAR列的最大大小不到32 KiB。
  • 使用一種編程語言,可以在ESQL/C中處理Informix'locator'結構—,用於保存TEXT的類型爲loc_t
  • 請考慮使用CLOB。但是,這具有相同的限制(CLOB轉換沒有字符串),但是您可以使用FILETOCLOB()函數將信息從客戶端上的文件獲取到數據庫(並且LOTOFILE將信息從數據庫傳輸到文件在客戶端)。

如果您可以使用LVARCHAR,那是迄今爲止最簡單的選擇。

+0

感謝您的回覆。不幸的是,用於與數據庫通信的是Java,而ORM(特別是Hibernate)。所以我擔心我不能利用'loc_t'定位器結構。至於LVARCHAR類型,它看起來像與MS SQL Server的NVARCHAR具有大致相同的限制,或者我錯了嗎?如果不是,我擔心我們的文本列將保存比4096個字符更長的字符串(如果使用UTF-8)。 –

+1

LVARCHAR默認爲2048字節,但可以達到32 KiB的陰影。但是整行長度也有32 KiB限制。 BYTE,TEXT,BLOB和CLOB在行中存儲固定大小(56字節或64字節)的描述符,並將數據存儲在別處。 LVARCHAR存儲在行中。你需要多大?您正在使用哪種JDBC驅動程序? Informix驅動程序(與Java通用客戶端或JDBC的JCC版本相對)應該很好地處理BYTE,TEXT,但可能不像SQL顯示的字符串字面值。 –

+0

我假設你沒有CAST而嘗試失敗?人們通常不會在CAST遇到問題之前添加CAST,但以防萬一... –

相關問題