奇怪的PostgreSQL"值太长,类型字符变化(500)"

Par*_*ham 36 sql database django postgresql postgresql-9.1

我有一个Postgres架构,看起来像:

在此输入图像描述

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

value too long for type character varying(500)
Run Code Online (Sandbox Code Playgroud)

在Postgres的文档中,它说类型文本可以包含无限制的字符.

我正在使用postgresql-9.1.

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

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

Cra*_*ger 31

通过指定列,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) 
Run Code Online (Sandbox Code Playgroud)

唯一的区别在于如何报告数据库元数据以及违反约束时引发的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
Run Code Online (Sandbox Code Playgroud)

并在显式转换中导致截断:

regress=> SELECT repeat('x',501)::varchar(1);
-[ RECORD 1 ]
repeat | x
Run Code Online (Sandbox Code Playgroud)

所以我认为你正在使用一个VARCHAR(500)列,而你正在查看错误的表或错误的数据库实例.

  • @Parham 我明白了。解释仍然相关;`varchar(500)` 正在某处使用。请显示您问题中的实际查询,以便我们可以看到失败的查询。如果您无法从 Django 获取它,请从 PostgreSQL 日志文件获取它并编辑您的问题以将查询添加到问题中。如果完整的查询文本没有与错误一起记录,您可能需要在 `postgresql.conf` 中设置 `log_statement = 'all'` 并重新加载 PostgreSQL。 (2认同)

小智 7

我们也遇到了同样的问题。我们通过在实体属性定义中添加“长度”来解决这个问题:

@Column(columnDefinition="text", length=10485760)
private String configFileXml = ""; 
Run Code Online (Sandbox Code Playgroud)


Sco*_*t S 6

字符变化与文本不同.试试跑步

ALTER TABLE product_product ALTER COLUMN code TYPE text;
Run Code Online (Sandbox Code Playgroud)

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

  • 我编辑了问题,问题出在已经输入文本的描述字段中 (2认同)