Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入包含新行和引号的文本列的条目时出错_Sql_Informix - Fatal编程技术网

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

Sql 插入包含新行和引号的文本列的条目时出错,sql,informix,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),

我有一个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]未从字符转换为文本

我发现我应该添加此语句,以允许在文本文本中使用新行,因此我在前面已经编写的相同查询中添加了此语句:

EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('t');
不过,我还是收到了同样的错误

我还阅读了IBM文档,其中说:要允许新行,我可以在
ONCONFIG
文件中设置
allow\u NEWLINE
参数。我想最后一个需要对服务器进行管理访问才能修改配置文件,我没有,我不想利用这个设置。

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

您有多种选择:

  • 在表中使用LVARCHAR(如果您的值不会超过几KiB,那么这很好,因为总行长约为32 KiB)。LVARCHAR列的最大大小略低于32kib
  • 使用能够处理Informix“定位器”结构的编程语言-在ESQL/C中,用于保存文本的类型是
    loc\t
  • 考虑改用CLOB。但是,这也有相同的限制(没有字符串到CLOB的转换),但是您可以使用
    FILETOCLOB()
    函数将信息从客户机上的文件获取到数据库(并且
    LOTOFILE
    将信息从DB传输到客户机上的文件)

如果你可以使用LVARCHAR,那是目前为止最简单的选择。

我忘了在问题中提到一个重要的细节-我使用Java和Hibernate ORM访问我的Informix数据库,因此中建议的一些方法(特别是
locu t
处理)不幸不适用。另外,我需要存储动态长度的大数据,我担心
LVARCHAR
列不足以保存它


我让它工作的方法是遵循的建议,并使用
PreparedStatement
。这可以通过Informix以自己的方式处理
文本
数据类型来解释。

感谢您的回复。不幸的是,用于与数据库和ORM(特别是Hibernate)通信的是Java。因此,我担心我无法利用
loc\u t
定位器结构。至于LVARCHAR类型,看起来它与MS-SQL服务器的NVARCHAR具有大致相同的限制,还是我错了?如果不是,我担心我们的文本列将包含超过4096个字符的字符串(如果使用UTF-8)。LVARCHAR默认为2048字节,但可能会高达32kib。但整行长度也有32千磅的限制。字节、文本、BLOB和CLOB在行中存储固定大小(56字节或64字节)的描述符,数据存储在其他位置。LVARCHAR存储在行中。你需要多大?您正在使用哪个JDBC驱动程序?Informix驱动程序(与Java Common Client或JDBC的JCC版本相反)应该能够很好地处理字节、文本,但可能不像SQL中显示的那样是字符串文本?在遇到问题之前,人们通常不会添加CAST,但以防万一……我们正在使用IBM的Informix驱动程序。存储的大部分数据是大型CSV数据,从用户上传的文件中读取。应用程序已经编写为使用PostgreSQL,因此没有从DB服务器直接读取文件。我们的任务是迁移相同的应用程序以使用Informix。是的,我尝试过使用
CAST
但没有成功。您也可以尝试使用PreparedStatement。它可以很好地与JDBC和文本列配合使用。见我的问题: