2012-05-07 47 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,但以防万一... –

相关问题