我有一个夹具(json),它在开发环境中加载,但在服务器环境中没有这样做.错误说:" DatabaseError: value too long for type character varying(50)
"
我的开发环境是Windows和Postgres 8.4.服务器运行Debian和Postgres 8.3.两个系统中的数据库编码均为UTF8.
就好像夹具中的unicode标记计为服务器上的字符,它们会导致某些字符串超出其字段的最大长度.然而,这在开发环境中不会发生..
更新:Django 1.8中的50个字符限制现在为255
-
原始答案:
我今天下午刚刚遇到这个,我有一个修复(种类)
这篇文章暗示它是一个Django错误,与auth_permission允许的值的长度有关.进一步的挖掘支持这个想法,就像这张Django票一样(尽管它最初与MySQL有关).
基本上,基于模型的verbose_name和描述性权限字符串创建权限名称,并且该权限名称可以溢出到auth.models.Permission.name中允许的超过50个字符.
引用Django票的评论:
auth_permission.name列中字符串值的最长前缀是"可以更改"和"可以删除",两者都有11个字符.列的最大长度为50,因此Meta.verbose_name的最大长度为39.
一个解决方案是破解该列以支持> 50个字符(理想情况下通过南迁移,我说,这样很容易重复)但是我能想到的最快,最可靠的修复只是简单地使我的超长verbose_name定义更短(从verbose_name中的47个字符到大约20个字符).现在一切正常.
那么,差异的是模板数据库的编码.在生产服务器上,他们使用ascii编码,而在dev框中则为utf-8.
默认情况下,postgres使用template1创建数据库.我的理解是,如果它的编码不是utf-8,那么即使你用utf-8编码创建它,你创建的数据库也会遇到这个问题.
因此我删除它并将其编码设置为UTF8重新创建它.下面的代码片段(取自此处):
psql -U postgres UPDATE pg_database SET datallowconn = TRUE where datname = 'template0'; \c template0 UPDATE pg_database SET datistemplate = FALSE where datname = 'template1'; drop database template1; create database template1 with template = template0 encoding = 'UNICODE'; UPDATE pg_database SET datistemplate = TRUE where datname = 'template1'; \c template1 UPDATE pg_database SET datallowconn = FALSE where datname = 'template0';
现在夹具平稳地加载.