Django を2.2 → 3.1 にバージョンアップしたら、以下の Warning が出るようになった。
test_app.Thumbnail.url: (mysql.W003) MySQL may not allow unique CharFields to have a max_length > 255. HINT: See: https://docs.djangoproject.com/en/3.1/ref/databases/#mysql-character-fields
日本語にすると「MySQL は 255文字以上の max_length を持つ CharField に unique を付与できないかもしれない」
と書いてあります。
しかし、これ、Django 3.1 で Warning が出るようになりましたが、今まで問題なくマイグレーションできていました。
一体どういうことでしょう。
長さが MySQL の設定などによって違う
以下の記事にも書きましたが、 MySQL のテーブルの設定によって、インデックスや unique にできる CharField の長さが違います。
記事では主にインデックスについて書かれていますが、 unique も同じです。実際にどれくらいの長さなのかは記事を読んでください。
いろいろな設定がありますが、一番長さが短い設定のとき、インデックスや unique が張れるのは 767 バイト、文字数にすると 255 文字になります。
設定によっては255文字超ててもインデックス張れるが、張れない場合もあるので、「unique にできない かもしれません」というエラーになります。
どう対応すれば良いのか
実際にマイグレーションして、テーブルが作れたなら問題有りません。
Warning を消したいのであれば、設定で SILENCED_SYSTEM_CHECKS
を指定して、Warning を抑制するのが良いと思います。
SILENCED_SYSTEM_CHECKS = ['mysql.W003']