我需要在现有的Django / South / MySQL应用程序中存储长度超过255个字符的URL。这些URL用作外键。问题是排序规则是UTF8,所以如果我将URLField的max_length增加到512,我会收到以下错误:
'Specified key was too long; max key length is 767 bytes'
我想原因是在UTF8中,每个字符的长度可能是3个字节,所以即使只有256个字符,我也可以超过限制。
由于URL应该只包含ASCII字符,我尝试在(数据)迁移中将特定表的排序规则更改为ASCII,并且它似乎运行良好:迁移后,我可以成功地将max_length更改为512后续架构迁移并存储更长的URL。
但是,当引导数据库时,我遇到的问题是它尝试设置数据库而不进行迁移:
syncdb --all
migrate --fake
syncdb当然失败了,因为它再次尝试创建太长的外键(不运行迁移以调整数据库的排序规则)。
如果我在没有--all的情况下syncdb(然后在没有--fake的情况下运行迁移),它就会失败,说某些认证表不存在。
是否有正确的方法来增加max_length限制?
答案 0 :(得分:4)
最好,也许只有解决方案:根本不要使用网址作为外键。
将网址放在一个带有surrogate key的表中(例如,自动增量整数)。将该键用于外键,并在url列上放置一个唯一索引,以防止重复的URL。
答案 1 :(得分:0)
我采取的侵入性较小且不太干净的方法是:
由于在设置新数据库时通常不会运行迁移,因此我创建了一个用于创建索引的管理命令,此命令必须在syncdb和migrate之后运行:
./manage.py syncdb --all
./manage.py migrate --fake
./manage.py create_indexes
使用myapp/management/commands/create_indexes.py
作为管理命令,运行原始SQL命令以创建带前缀的索引。