/ / UTF8 mysqlデータベースの255文字より長いキー-mysql、django、utf-8、django-south

mysql、django、utf-8、django-southのUTF8 mysqlデータベースで255文字以上のキー

255文字より長いURLを保存する必要があります既存のDjango / South / MySQLアプリケーションで。これらの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制限を増やす適切な方法のアイデアはありますか?

回答:

回答№1は4

最善の、そしておそらく唯一の解決策:URLを外部キーとして使用しないでください。

次のようなテーブルにURLを配置します サロゲートキー (たとえば、自動インクリメント整数)。そのキーを外部キーに使用し、URL列に一意のインデックスを配置して、URLの重複を防ぎます。


回答№2の場合は0

私が取った低侵襲でクリーンでないアプローチは、次のとおりでした。

  • つかいます プレフィックスサイズのインデックス。これは、移行時に生のSQLステートメントを使用してのみ実行できます。
  • 通常、新しいデータベースをセットアップするときに移行は実行されないため、インデックスを作成する管理コマンドを作成しました。このコマンドは、syncdbの後に実行して移行する必要があります。

    ./manage.py syncdb --all
    ./manage.py migrate --fake
    ./manage.py create_indexes
    

myapp/management/commands/create_indexes.py 生のSQLコマンドを実行してプレフィックス付きのインデックスを作成する管理コマンドです。