2012-05-07 13 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]テキストへのcharからのキャスト。

私はテキスト・リテラルで新しい行を使用して可能にするために、この文を追加しなければならないことがわかったので、私は、私はすでに書かれている同じクエリの上にこれを追加しました:まだ

EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('t'); 

、私が受け取ります同じエラー。

私はまた、新しい行を代わりに許可するために、ONCONFIGファイルにALLOW_NEWLINEパラメータを設定することができるIBMのドキュメントを読んでいます。私は最後の1つは、私が持っていない、その設定ファイルを変更するためにサーバーへの管理アクセスが必要と仮定し、私はこの設定を利用しないことを好む。

答えて

0

私はJavaとHibernate ORMを使用してInformixデータベースにアクセスしていますので、Jonathan Leffler's answerの推奨アプローチ(特にloc_tハンドリング)のいくつかは残念ながら適用されません。また、私は動的な長さの大きなデータを格納する必要があり、私はLVARCHAR列を保持するのに十分ではない恐れがあります。

私が働く方法は、Michał Niklasの提案from his commentに従うことでした。PreparedStatementを使用してください。これは、Informixが独自の方法でTEXTデータ型を渡すことによって潜在的に説明される可能性があります。

3

InformixのTEXT(およびBYTE)列は、どの標準よりも先行しており、多くの点で非常に特殊な型です。 InformixのTEXTは、他のDBMSにあるTEXTとは大きく異なります。長年にわたる(20年以上の)問題の1つは、データを挿入するための文字列の表記法がないことです。 '文字から文字へのキャストなし'は、文字列リテラルからTEXTへの明示的な変換がないことを示しています。

あなたは、さまざまなオプションがあります:表中の

  • 使用LVARCHARを(合計行の長さが約32 KiBのであるので、良いあなたの値は、いくつかのKiBのよりも長くない場合)。 LVARCHAR列の最大サイズは32 KiB未満です。
  • ESQL/CでInformixのロケータ構造—を処理できるプログラミング言語を使用し、TEXTを保持するために使用される型はloc_tです。
  • 代わりにCLOBの使用を検討してください。しかし、これには同じ制限があります(文字列からCLOBへの変換はありません)が、FILETOCLOB()関数を使用してクライアント上のファイルからデータベースに情報を取得できます(LOTOFILEはDBからファイルに情報を転送します)クライアント上で)。

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 Common ClientまたはJCCバージョンのJDBCとは対照的に)は、BYTE、TEXTを合理的に処理する必要がありますが、SQLのように文字列リテラルではない可能性があります。 –

+0

CASTなしで試してみて失敗したと思いますか?人々は通常、問題に遭遇するまでCASTを追加するつもりはありませんが、場合によっては... –

関連する問題