diff --git a/django/db/backends/mysql/validation.py b/django/db/backends/mysql/validation.py index fc4dc500e1..41e600a856 100644 --- a/django/db/backends/mysql/validation.py +++ b/django/db/backends/mysql/validation.py @@ -41,11 +41,15 @@ class DatabaseValidation(BaseDatabaseValidation): if (field_type.startswith('varchar') and field.unique and (field.max_length is None or int(field.max_length) > 255)): errors.append( - checks.Error( - '%s does not allow unique CharFields to have a max_length ' + checks.Warning( + '%s may not allow unique CharFields to have a max_length ' '> 255.' % self.connection.display_name, obj=field, - id='mysql.E001', + hint=( + 'See: https://docs.djangoproject.com/en/%s/ref/' + 'databases/#mysql-character-fields' % get_docs_version() + ), + id='mysql.W003', ) ) diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt index 5f9f9301ed..2ebaf5201f 100644 --- a/docs/ref/checks.txt +++ b/docs/ref/checks.txt @@ -127,9 +127,12 @@ MySQL and MariaDB If you're using MySQL or MariaDB, the following checks will be performed: * **mysql.E001**: MySQL/MariaDB does not allow unique ``CharField``\s to have a - ``max_length`` > 255. + ``max_length`` > 255. *This check was changed to* ``mysql.W003`` *in Django + 3.1 as the real maximum size depends on many factors.* * **mysql.W002**: MySQL/MariaDB Strict Mode is not set for database connection ''. See also :ref:`mysql-sql-mode`. +* **mysql.W003**: MySQL/MariaDB may not allow unique ``CharField``\s to have a + ``max_length`` > 255. Model fields ------------ diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index f61158c191..4d4a7d2aa9 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -581,13 +581,18 @@ these methods in no-op's based in the results of such detection. Notes on specific fields ------------------------ +.. _mysql-character-fields: + Character fields ~~~~~~~~~~~~~~~~ -Any fields that are stored with ``VARCHAR`` column types have their +Any fields that are stored with ``VARCHAR`` column types may have their ``max_length`` restricted to 255 characters if you are using ``unique=True`` for the field. This affects :class:`~django.db.models.CharField`, -:class:`~django.db.models.SlugField`. +:class:`~django.db.models.SlugField`. See `the MySQL documentation`_ for more +details. + +.. _the MySQL documentation: https://dev.mysql.com/doc/refman/en/create-index.html#create-index-column-prefixes ``TextField`` limitations ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/invalid_models_tests/test_ordinary_fields.py b/tests/invalid_models_tests/test_ordinary_fields.py index 8cfe41f0f1..d263dc5cc9 100644 --- a/tests/invalid_models_tests/test_ordinary_fields.py +++ b/tests/invalid_models_tests/test_ordinary_fields.py @@ -8,6 +8,7 @@ from django.test.utils import isolate_apps, override_settings from django.utils.functional import lazy from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ +from django.utils.version import get_docs_version @isolate_apps('invalid_models_tests') @@ -372,11 +373,15 @@ class CharFieldTests(SimpleTestCase): field = Model._meta.get_field('field') validator = DatabaseValidation(connection=connection) self.assertEqual(validator.check_field(field), [ - Error( - '%s does not allow unique CharFields to have a max_length > ' + DjangoWarning( + '%s may not allow unique CharFields to have a max_length > ' '255.' % connection.display_name, + hint=( + 'See: https://docs.djangoproject.com/en/%s/ref/databases/' + '#mysql-character-fields' % get_docs_version() + ), obj=field, - id='mysql.E001', + id='mysql.W003', ) ])