DatabaseError:类型字符变化的值太长(100)

Posted

技术标签:

【中文标题】DatabaseError:类型字符变化的值太长(100)【英文标题】:DatabaseError: value too long for type character varying(100) 【发布时间】:2012-02-20 14:35:28 【问题描述】:

我有一个 Django 网站,运行我们多年前在内部构建的迷你 CMS,它使用的是 postgresql。保存简单标题和一段文本时,出现以下错误:

value too long for type character varying(100)

奇怪的是,没有一个列在变化(100),它们都是 200 或 250,即使是默认的 Django 列也由于 re-opened ticket mentioned here 而从 100 更改为 200

有人知道这个问题的解决方法吗?

【问题讨论】:

【参考方案1】:

对于 FileField 和 ImageField,来自 Django 文档:

FileField 实例在您的数据库中创建为 varchar 列,默认最大长度为 100 个字符。与其他字段一样,您可以使用 max_length 参数更改最大长度。

【讨论】:

【参考方案2】:

该值可以是 100 或 25 或 17 等等,其背后的原因是模型,搜索您添加特定长度(17,25)的位置,您将得到错误! ,

您正试图强加一个比提到的更长的字段长度。

这解决了我的问题,希望对你也有帮助

【讨论】:

问题与此无关。 slug 的默认最大长度是 50(或者可能是在我第一次问这个问题的时候),但是 slug 比 50 长,所以它正在创建错误。向 slugfield 添加 max_length 解决了这个问题 先生,我的项目中没有任何 slud 字段,但错误仍然存​​在,...仔细查看我发现的模型...它解决了我的问题【参考方案3】:

我敢打赌你有一个没有长度设置的models.SlugField。默认长度为50 characters,很可能对于您的用例来说还不够。

将其更改为 models.SlugField(max_length=255) 并迁移您的数据库架构。

【讨论】:

你明白了。我不认为这是问题所在,因为默认情况下 Django 将它们存储为变量(50),但项目中的一个依赖项具有用于 slug 字段的模型变量(100);我忽略了它。 @michael 这令人印象深刻。我被卡住了。 那么像slug = models.SlugField(max_length=255),然后迁移到heroku上? 是的,然后运行./manage.py makemigrations && ./manage.py migrate 在我的情况下,它是一个最大长度设置为 10 的 CharField。...我将其更改为 TextField,它运行顺利...【参考方案4】:

model.py 中的预定义字段会产生问题。将其延长到所需的长度,我认为问题将得到解决。

【讨论】:

【参考方案5】:

我遇到了同样的错误。当我在模型中进行更改时,我一直有同样的错误。

这是我修复它的方法。 程序可能需要跳过一些迁移,以仅使用对 CharField max_lenght 进行了更改的迁移。

为此你必须运行

python manage.py showmigrations 

查看哪些迁移尚未进行。

然后你跳过它们直到你用命令到达最后一个

python manage.py migrate <app> 000_migration_number --fake 

【讨论】:

【参考方案6】:

首先,尝试在模型中的所有适用字段类型上将 max_length 设置为合理的值。

例如:MyText = models.CharField(max_length=2000)

如果您没有设置 max_length,您的数据库可能会应用默认的 max_length,比输入数据的长度短,从而导致您的 value too long for type character 错误。

如果这不起作用并且您从 SQLite 开始并将数据库更改为 PostgreSQL,则以前从 SQLite 的迁移可能会干扰新的 PostgreSQL 迁移。

进入项目的迁移文件夹并删除旧的迁移文件以重新开始。然后尝试 makemigrations 并再次迁移:)

【讨论】:

嗨安娜莱丝!感谢您的评论。我认为迁移不依赖于特定的数据库引擎。你有例子吗??无论哪种方式,您现在的评论都没有回答这个特定问题 感谢您的反馈!我不相信迁移应该依赖于数据库。但是,尽管为所有字段设置了 max_length,但我遇到了与原始海报相同的错误。唯一有效的操作是删除以前的迁移并重新开始。我将编辑我的帖子以更好地回答问题。【参考方案7】:

Django 2.1

我在从 sqlite3 切换到 postgresql 时遇到了这个问题。 删除除 __init__.py 之外的每个应用的迁移文件夹中的迁移文件 然后重新运行迁移

(venv)myapp$python manage.py makemigrations
(venv)myapp$python manage.py migrate
(venv)myapp$python manage.py runserver

【讨论】:

它没有帮助我,迁移的创建不依赖于数据库。【参考方案8】:

如果不是SlugFieldFileField 或此处提到的任何其他字段--滚动回迁移卡在终端中的位置。对我来说是AddField

说得好。

【讨论】:

【参考方案9】:

Michael Samoylov 的回答为我指明了正确的方向。我遇到了同样的错误,除了 FileField。

字段有一个 max_length,即使您没有明确设置 max_length。增加该值以使您的数据适合以避免错误。

就我而言,数据太大而无法合理地存储在数据库中。我将文件保存到磁盘,然后将文件路径保存在数据库中。

【讨论】:

是的,我认为 Django 应该默认使用最大 SQL 大小而不是假设什么是安全大小,并让用户通过在他们的字段中添加 max_length 来覆盖默认值。跨度> 【参考方案10】:

我在 django-autoslugfield 上遇到了类似的问题 我正在使用类似的包,然后切换到 django-autoslugfield

我收到此错误: value too long for type character varying(50)

尽管我的 models.py 有:

slug = AutoSlugField(max_length=255, populate_from='name', unique=True)

在我的数据库中,它的类型是 character varying 255

一旦我从字段中删除max_length=255,即

slug = AutoSlugField(populate_from='name', unique=True)

然后就正常了

【讨论】:

对我来说也是如此。但是当我删除 max_length 时,它不会改变任何东西。我得到同样的错误:对于类型字符变化(50)的值太长。当我切换到 django 自己的 slugField 时,它可以使用 max_length 属性。【参考方案11】:

我意识到这个问题已经得到解答,但是对于其他在寻找错误消息时来到这里的人:

就我而言,问题是我的表名超过了 50 个字符。显然这是不允许的。更改表名解决了这个问题。

在此处阅读更多信息:https://code.djangoproject.com/ticket/18959

【讨论】:

【参考方案12】:

我在使用文件字段时也遇到了这个问题,我摸不着头脑。当然,默认 FileField 实例的创建限制为 100 个字符。

https://docs.djangoproject.com/en/dev/ref/models/fields/#filefield

【讨论】:

对于那些使用长路径的 FileField(例如非常长的文件名或路径)的人,这可能是问题而不是 SlugField。 CMIIW。【参考方案13】:

这是来自 Postgres 而不是 django 的错误消息。

您似乎更改了models.py 中字段的长度,但这并没有更改您执行manage.py syncdb 时创建的数据库长度。

您必须直接更改数据库中字段的长度。

【讨论】:

我没有只在模型中更改它们。当我们更改数据库属性并且我们已经迁移之后,我像往常一样向南跑,我们在 postgres 中手动仔细检查了所有表,并且在任何地方都没有变化 100 的残余。我很困惑。

以上是关于DatabaseError:类型字符变化的值太长(100)的主要内容,如果未能解决你的问题,请参考以下文章

postgresql 错误:类型字符变化的值太长(256)

Django psycopg2.errors.StringDataRightTruncation:对于类型字符变化的值太长(200)

org.postgresql.util.PSQLException:错误:对于类型字符变化的值太长(255)

尽管我的字符串在范围内,但类型字符变量(x)的值太长

Python Django psycopg2.errors.StringDataRightTruncation:类型字符的值太长

SQL 查询返回“值太长”