我有一个Postgres架构,看起来像:
问题是每当我在描述栏中保存超过500个字符的文本时,我都会收到错误:
value too long for type character varying(500)
在Postgres的文档中,它说类型文本可以包含无限字符 .
我正在使用postgresql-9.1 .
这个表是使用Django 1.4生成的,模型中的字段类型是TextField,如果这有助于进一步解释问题 .
任何想法为什么会发生这种情况以及我可以做些什么来解决它?
通过将列指定为 VARCHAR(500) ,您显示了模型,完整错误文本或产生错误的查询 .
VARCHAR(500)
如果您不需要,请使用不合格的 VARCHAR ,或使用 TEXT 类型 .
VARCHAR
TEXT
varchar 和 text 的长度仅限于列大小的系统限制 - 约1GB - 以及您的内存 . 但是,向 varchar 添加长度限定符会手动设置较小的限制 . 以下所有内容大致相同:
varchar
text
column_name VARCHAR(500) column_name VARCHAR CHECK (length(column_name) <= 500) column_name TEXT CHECK (length(column_name) <= 500)
唯一的区别在于如何报告数据库元数据以及违反约束时引发的SQLSTATE .
在准备好的语句参数,函数调用等中通常不遵循长度约束,如下所示:
regress=> \x Expanded display is on. regress=> PREPARE t2(varchar(500)) AS SELECT $1; PREPARE regress=> EXECUTE t2( repeat('x',601) ); -[ RECORD 1 ]----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ?column? | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
并在显式转换中导致截断:
regress=> SELECT repeat('x',501)::varchar(1); -[ RECORD 1 ] repeat | x
所以我认为你正在使用 VARCHAR(500) 列,而你正在查看错误的表或错误的数据库实例 .
字符变化与文本不同 . 试试跑步
ALTER TABLE product_product ALTER COLUMN code TYPE text;
这会将列类型更改为文本,这仅限于一些非常大量的数据(您可能永远不会实际点击它 . )
我们遇到了同样的问题 . 我们解决了它为实体属性定义添加'length':
@Column(columnDefinition="text", length=10485760) private String configFileXml = "";
3 回答
通过将列指定为
VARCHAR(500)
,您显示了模型,完整错误文本或产生错误的查询 .如果您不需要,请使用不合格的
VARCHAR
,或使用TEXT
类型 .varchar
和text
的长度仅限于列大小的系统限制 - 约1GB - 以及您的内存 . 但是,向varchar
添加长度限定符会手动设置较小的限制 . 以下所有内容大致相同:唯一的区别在于如何报告数据库元数据以及违反约束时引发的SQLSTATE .
在准备好的语句参数,函数调用等中通常不遵循长度约束,如下所示:
并在显式转换中导致截断:
所以我认为你正在使用
VARCHAR(500)
列,而你正在查看错误的表或错误的数据库实例 .字符变化与文本不同 . 试试跑步
这会将列类型更改为文本,这仅限于一些非常大量的数据(您可能永远不会实际点击它 . )
我们遇到了同样的问题 . 我们解决了它为实体属性定义添加'length':