加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:28:52 所属栏目:百科 来源:网络整理
导读:我有一个Postgres模式,看起来像: 问题是,每当我在描述列中保存超过500个字符的文本时,我会收到错误: value too long for type character varying(500) 在Postgres的文档中,表示类型文本可以有无限的字符. 我使用postgresql-9.1. 该表已经使用Django 1.4生
我有一个Postgres模式,看起来像:

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

value too long for type character varying(500)

在Postgres的文档中,表示类型文本可以有无限的字符.

我使用postgresql-9.1.

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

任何想法,为什么这是发生和我可以做什么来解决它?

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

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

varchar和文本的长度仅限于列大小(约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)列,你正在查看错误的表或错误的数据库实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读