sql - 奇怪的 PostgreSQL "value too long for type character varying(500)"

标签 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,如果这有助于进一步说明问题。

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

最佳答案

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

关于sql - 奇怪的 PostgreSQL "value too long for type character varying(500)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13485030/

相关文章:

mysql - mysql无法添加外键

python - 表名 SQL 语法错误

Django 的 HttpResponseRedirect 是 http 而不是 https

sql - 避免 CurrentAccountBalance 更新时出现 SQL 死锁

sql - 使用一个查询插入多行

mysql - 如何找到具有最多匹配列的行?

sql - db2 "DB21018E A system error occurred. The command line processor could not continue processing."

javascript - 由于唯一的 id 容器,无法检查 Firebase 中是否存在数据

python - django 包和 python 库有什么区别?

python - 在 Django 中将静态文件中的图像添加到多部分电子邮件中