【问题标题】:Strange PostgreSQL "value too long for type character varying(500)"奇怪的 PostgreSQL“对于类型字符变化的值太长(500)”
【发布时间】:2012-11-09 05:14:21
【问题描述】:

我有一个 Postgres 架构,如下所示:

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

value too long for type character varying(500)

在 Postgres 的文档中,它说类型文本可以有无限的字符。

我正在使用 postgresql-9.1。

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

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

【问题讨论】:

  • psql 插入是否会出现问题,还是仅来自 django?
  • 既然您已经从 Django 模型生成了表格,那么显示您的 Django 模型代码怎么样?
  • 我刚刚通过命令行检查了 psql 插入,那里没有发生错误。可能是编码问题。
  • 不,这不是编码问题。请显示 Django 生成的实际 INSERT 语句,以及错误消息的完整、准确的文本。您可以从 PostgreSQL 日志文件中获取两者。

标签: sql database django postgresql postgresql-9.1


【解决方案1】:

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

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

varchartext 的长度仅受系统对列大小的限制(大约 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) 列,并且您正在查看错误的表或错误的数据库实例。

【讨论】:

  • 我用的是type text看描述栏
  • @Parham 我明白了。解释仍然相关; varchar(500) 正在某处使用。请在您的问题中显示实际查询,以便我们可以看到失败的查询。如果您无法从 Django 中获取,请从 PostgreSQL 日志文件中获取并编辑您的问题以将查询添加到问题中。您可能需要在 postgresql.conf 中设置 log_statement = 'all' 并重新加载 PostgreSQL,如果完整的查询文本没有与错误一起记录。
  • 我刚刚按照您的建议检查了日志文件,结果发现在保存另一个相关字段时发生了错误
【解决方案2】:

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

ALTER TABLE product_product ALTER COLUMN code TYPE text;

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

【讨论】:

  • 我编辑了问题,问题在于描述字段已经是文本类型
【解决方案3】:

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

@Column(columnDefinition="text", length=10485760)
private String configFileXml = ""; 

【讨论】:

    【解决方案4】:

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

    把它改成更大的值!

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 2020-03-27
      • 2021-12-20
      • 2021-06-22
      • 1970-01-01
      • 2021-10-20
      • 2016-07-26
      • 2021-04-03
      相关资源
      最近更新 更多