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 文档,上面写着:或者允许换行,我可以在文件中设置ALLOW_NEWLINE参数。ONCONFIG我想最后一个需要对服务器的管理访问权限来更改我没有的配置文件,我不想利用这个设置。

4

2 回答 2

3

Informix 的 TEXT(和 BYTE)列早于任何标准,并且在许多方面都是非常特殊的类型。Informix 中的 TEXT 与其他 DBMS 中的 TEXT 非常不同。其中一个长期存在(超过 20 年)的问题是没有可用于向其中插入数据的字符串文字表示法。'No cast from char to text' 是说没有从字符串文字到 TEXT 的显式转换。

您有多种选择:

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

如果您可以使用 LVARCHAR,那是迄今为止最简单的选择。

于 2012-05-07T14:21:03.830 回答
0

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

我让它工作的方式是按照Michał Niklas从他的评论中的建议,并使用PreparedStatement. 这可以通过 InformixTEXT以自己的方式处理数据类型来解释。

于 2014-05-15T21:46:00.980 回答