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

lnlaulya  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(7)|浏览(174)

我有一个Postgres模式,如下所示:

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

value too long for type character varying(500)

在Postgres的文档中,它说类型文本可以有无限的字符。
我用的是postgresql-9.1。
这个表是使用Django 1.4生成的,模型中的字段类型是TextField,如果这有助于进一步解释问题的话。
有什么想法,为什么会发生这种情况,我可以做些什么来解决它?

hgncfbus

hgncfbus1#

通过将列指定为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。
在预准备语句参数、函数调用等中通常不遵守长度约束,如下所示:

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

fivyi3re

fivyi3re2#

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

ALTER TABLE product_product ALTER COLUMN code TYPE text;

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

hkmswyz6

hkmswyz63#

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

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

wfsdck304#

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

bf1o4zei

bf1o4zei5#

我遇到了同样的问题。对于我的例子,我去了pgAdmin〉Schemas〉Tables〉blog_post,然后箭头点击“列”,然后找到了列,字符varing(25)。右键点击,然后属性,点击“定义”。最后我看到了“长度/精度”。我把25改为50。就是这样。一切都很好。
再次,你需要改变你的列的大小。进入pgAdmin〉Schemas〉Tables〉(你的app_model名称)〉Columns〉(你有问题的列)〉Definition〉Length把大小变大。就是这样!!!
祝你好运!

vptzau2j

vptzau2j6#

通过Scot S添加到答案here
对于Django图像字段或文件字段,
在www.example.com中添加max_lengthmodels.py对我很有效。

img1 = models.ImageField(upload_to=user_directory_path,**max_length=500**)
w1e3prcc

w1e3prcc7#

在我的例子中:
迁移a

CharField(max_length=1) to CharField(max_length=2)

然后保存一些数据。然后我想迁移回
数据库中已经有类似"sg"的数据。
只是暂时将其缩短将修复此错误
请注意,如果你有django-simple-history安装。到那里,并更改/删除数据以及

  • 错误日志没有显示是哪个表/字段,但是varying(1)指示了您应该转到的位置。*

相关问题