mysql - UTF8 mysql 数据库中超过 255 个字符的键

标签 mysql django utf-8 django-south

我需要在现有的 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 的情况下同步数据库(然后在没有 --fake 的情况下运行迁移),它会失败并指出某些身份验证表不存在。

知道增加 max_length 限制的正确方法吗?

最佳答案

最好的,也可能是唯一的解决方案:根本不要使用 url 作为外键。

将 url 放入带有 surrogate key 的表格中(例如,自动递增整数)。将该键用于外键,并在 url 列上放置一个唯一索引以防止重复的 url。

关于mysql - UTF8 mysql 数据库中超过 255 个字符的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30969101/

相关文章:

mysql - 如何将一行的初始状态与 MySQL 中的最新状态结合起来?

php - 如何将mysql数据放入弹出窗口?

sql - 数据建模 - 如何处理两个相关的 "status"列?

php - 使用 PHPexcel 插件生成的可下载 Excel 文件中没有获取任何值

python - upload_to 值更改 photo.name 属性

Django:在一段时间后更新模型属性

python - 删除查询集时Django ValidationError

c - 如何检测ODBC DB2连接编码(代码页)

php - 定位mysql数据库中不可见的utf8字符

php - 从文件加载 HTML 时保留 utf8