概要
- djangoでは
IntegerField
はデフォルトで11で、これは変更できない?と聞いたので、実際に検証してみました。 - 結論、整数値には「文字列の長さ」に関する制限はなく、あくまで「最大値」に関する制限があるということになります。
IntegerFieldとは?
-
IntegerField
= データベースに保存される整数値を表すためのフィールド(Pythonのint型と対応)。 - Djangoの
models.py
で定義する際に使用されます。 - 検証しようと思ったのは、以下の記事。
IntegerField
にはmax_length
を設定しても効果がない、という記述がありました。
max_length=10
でマイグレートするとどうなる?
- 試しに、
max_length
オプションに以下の3パターンで実施することにしました。max_length=11
max_length=10
-
max_length
記載なし
max_length=11
の場合
-
max_length=11
を指定した状態でマイグレートしたら以下のメッセージが返ってきました。
System check identified some issues:
WARNINGS:
customer.Customer.id: (fields.W122) 'max_length' is ignored when used with IntegerField.
HINT: Remove 'max_length' from field
- ご丁寧に、
max_length
を消してくださいというヒントまで記載しています。。。 - DBを見に行くと、もちろんですが
int(11)
となっています。
max_length=10
の場合
- やはり同じエラーメッセージが出ます。
- DBを見に行くと、、
int(11)
となっています。これで、デフォルトで11
であり、変更ができないことがわかりました。
max_length
記載なしの場合
- 勿論エラーメッセージは表示されません。
- DBを見に行くと、
int(11)
となっています。確実ですね。
検証結果
- 以上の検証から、デフォルトで11桁であり、そこから変更ができないことがわかります。
- MySQLにおけるINT型の最大桁数は11桁。DjangoがMySQLをサポートするためにデフォルトで11桁にしたのでしょう。
整数値の場合はmin_value
とmax_value
を使え
- 冒頭でも記載したように、そもそも
max_length
オプションは文字列フィールド(CharField
やTextField
など)で使用されるオプションです。 - 整数値を保存する
IntegerField
の場合、min_value
とmax_value
オプションがあり、これらを使うことで、フィールドに許可される値の範囲を制限します。 - ちなみにMySQLでは、INTEGERフィールドに保存できる最大値は
2147483647
(32ビット符号付き整数型で表現できる最大値)となっています。あれ、10桁では?と思ったが、マイナスも入るので-2147483648
を考慮しているっぽい。- 正確にいうと、、、
-2147483648
は10桁の整数。符号を入れると11桁の桁数が必要、という意味
- 正確にいうと、、、
デフォルトの最大桁数より大きいデータが入った場合は?
- MySQLではデフォルトで値の範囲チェックを行なってくれず、自動で丸めるようになっているようです。確かにテストで適当に999...とか以前入れたデータを突っ込んだら、この数値がたくさん出てきた記憶があります。そういう意味だったのか。
デフォルトの最大桁数より大きくしたい場合は?
- デフォルトでは21億までidを触れるわけですが、それを超える!という場合は、
BigIntegerField
を使用することで解決できます。 - 最大で20桁の整数値を保存することができるとのこと。
小数点以下を含むフィールドであれば最大桁数を指定できる
-
DecimalField
、FloatField
、DecimalRangeField
、FloatRangeField
のような小数点以下を含むフィールドであれば、max_digits
というオプションで数字部分の最大桁数を、decimal_places
で小数部分の桁数の指定できます。 - 例えば、以下の場合は、整数部分は6桁が最大の有効値となります。最大値は999999.99です。
models.py
menseki = models.DecimalField(
db_column='menseki',
default=0,
null=True,
max_digits=8,
decimal_places=2)
- 桁数オーバーの場合、
decimal.InvalidOperation
という例外が発生します。