插入包含新行和引号的文本列时出错

时间:2012-05-07 13:09:00

标签: sql informix

我有一个Informix 11.70数据库。我无法在表上成功执行此insert语句。

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');

仍然,我收到同样的错误。

我还阅读了IBM文档,其中说:或者允许换行,我可以在ALLOW_NEWLINE文件中设置ONCONFIG参数。我想最后一个需要管理员访问服务器来改变我没有的配置文件,我不想利用这个设置。

2 个答案:

答案 0 :(得分:3)

Informix的TEXT(和BYTE)列可以预先标出任何标准,并且在很多方面都是非常特殊的类型。 Informix中的TEXT与其他DBMS中的TEXT非常不同。其中一个长期存在(超过20年)的问题是,没有可用于将数据插入其中的字符串文字符号。 “从字符到文本的无法转换”表示没有从字符串文字到TEXT的显式转换。

您有多种选择:

  • 在表格中使用LVARCHAR(如果您的值不会超过几个KiB,那就太好了,因为总行长度约为32 KiB)。 LVARCHAR列的最大大小不到32 KiB。
  • 使用可以处理Informix'定位器'结构的编程语言 - 在ESQL / C中,用于保存TEXT的类型为loc_t
  • 请考虑使用CLOB。但是,这具有相同的限制(没有字符串到CLOB转换),但是您可以使用FILETOCLOB()函数从客户端上的文件获取信息到数据库(和LOTOFILE将信息从数据库传输到客户端上的文件。

如果你可以使用LVARCHAR,那是迄今为止最简单的替代方案。

答案 1 :(得分:0)

我忘了提问题中的一个重要细节 - 我使用Java和Hibernate ORM来访问我的Informix数据库,因此Jonathan Leffler's answer中的一些建议方法(特别是loc_t处理)遗憾的是不适用。此外,我需要存储动态长度的大数据,我担心LVARCHAR列不足以容纳它。

我开始工作的方式是遵循Michał Niklas的建议from his comment,然后使用PreparedStatement。这可能是Informix以自己的方式处理TEXT数据类型的原因。