--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -1086,6 +1086,7 @@ class CharField(Field):
     def check(self, **kwargs):
         databases = kwargs.get("databases") or []
         return [
             *super().check(**kwargs),
             *self._check_max_length_attribute(**kwargs),
+            *self._check_max_length_fits_choices(**kwargs),
             *self._check_db_collation(databases),
         ]
 
@@ -1118,6 +1119,25 @@ class CharField(Field):
             ]
         return []
 
+    def _check_max_length_fits_choices(self, **kwargs):
+        if self.max_length is not None and self.choices is not None:
+            choice_max_length = 0
+            for choice in self.flatchoices:
+                value = choice[0]
+                if isinstance(value, str):
+                    choice_max_length = max(choice_max_length, len(value))
+
+            if choice_max_length > self.max_length:
+                return [
+                    checks.Error(
+                        "'max_length' is too small to fit the longest value "
+                        "in 'choices' (%d characters)." % choice_max_length,
+                        obj=self,
+                        id='fields.E009',
+                    ),
+                ]
+        return []
+
     def cast_db_type(self, connection):
         if self.max_length is None:
             return connection.ops.cast_char_field_without_max_length