78

我有一个 Postgres 模式,它看起来像:

在此处输入图像描述

问题是,每当我在描述列中保存超过 500 个字符的文本时,我都会收到错误消息:

value too long for type character varying(500)

在 Postgres 的文档中,它说 type text 可以有无限的字符。

我正在使用 postgresql-9.1。

该表是使用 Django 1.4 生成的,模型中的字段类型是 TextField,如果这有助于进一步解释问题。

关于为什么会发生这种情况以及我能做些什么来解决它的任何想法?

4

4 回答 4

45

通过指定列,因为VARCHAR(500) 您设置了明确的 500 个字符限制。你自己可能没有明确地做到这一点,但 Django 已经在某个地方为你做到了。当您没有显示您的模型、完整的错误文本或产生错误的查询时,告诉您在哪里很难。

如果您不想要,请使用不合格的VARCHAR,或使用TEXT类型。

varchar并且text长度仅受系统对列大小的限制(大约 1GB)和您的内存限制。但是,添加长度限定符以varchar手动设置较小的限制。以下所有内容在很大程度上是等效的:

column_name VARCHAR(500)

column_name VARCHAR CHECK (length(column_name) <= 500) 

column_name TEXT CHECK (length(column_name) <= 500) 

唯一的区别在于如何报告数据库元数据以及违反约束时引发的 SQLSTATE。

在prepared statement参数、函数调用等中一般不遵守长度约束,如图:

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)列,并且您正在查看错误的表或错误的数据库实例。

于 2012-11-21T01:40:31.317 回答
13

字符变化不同于文本。尝试运行

ALTER TABLE product_product ALTER COLUMN code TYPE text;

这会将列类型更改为文本,这仅限于一些非常大量的数据(您可能永远不会真正点击它。)

于 2012-11-21T01:33:24.083 回答
5

我们有同样的问题。我们解决了在实体属性定义中添加“长度”的问题:

@Column(columnDefinition="text", length=10485760)
private String configFileXml = ""; 
于 2018-02-20T11:46:18.393 回答
0

我的问题是我在表中有数据,所以 PostgreSQL 不允许我对我的表进行更改!

将其更改为更大的价值!

于 2021-08-11T11:35:49.663 回答