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

时间:2012-11-21 01:28:49

标签: sql database django postgresql postgresql-9.1

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

enter image description here

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

value too long for type character varying(500)

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

我正在使用postgresql-9.1。

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

为什么会发生这种情况以及我可以采取哪些措施来解决这个问题?

4 个答案:

答案 0 :(得分:26)

通过将列指定为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)列,而您正在查看错误的表或错误的数据库实例。

答案 1 :(得分:6)

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

ALTER TABLE product_product ALTER COLUMN code TYPE text;

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

答案 2 :(得分:0)

我们遇到了同样的问题。我们解决了将'length'添加到实体属性定义:

Mat i1 = imread("1.jpg", 0); //read as a gray scale image
Mat i2 = imread("2.jpg", 0); //reas as a gray scale image

Mat flowMat; 

vector <Point2f> i1_corner, i2_corner;
vector <uchar> status;
vector <float> err;

goodFeaturesToTrack(i1, i1_corner, 1000, 0.01, 30);
createOptFlow_DIS(DISOpticalFlow::PRESET_ULTRAFAST)->calc(i1, i2, flowMat);
i2_corner.resize(i1_corner.size());
for( unsigned int i = 0; i < i1_corner.size(); i++)
{
    i2_corner[i] = i1_corner[i] + flowMat.at<cv::Point2f>(i1_corner[i]);
}

答案 3 :(得分:0)

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

将其更改为更大的值!