Django 3.2+: чувствительные к регистру сравнения строк в таблицах MySQL
В документации по Django (от 3.2 до 4.0) говорится:
В MySQL, коллизия таблицы базы данных определяет, будут ли сравнения строк сравнения (такие как выражение и подстрока этой функции) чувствительны к регистру. По умолчанию сравнения не чувствительны к регистру.
начиная с версии 3.2, упоминается, что теперь можно определить на уровне поля CharField, какое collation использовать: https://docs.djangoproject.com/en/3.2/ref/databases/#collation-settings
но я нигде не нашел, какое значение я должен использовать для db_collation
, чтобы включить чувствительные к регистру сравнения строк для данного CharField:
case_sensitive_collation = ???
name = models.CharField(max_length=50, db_collation=case_sensitive_collation)
Только что нашел эту статью, чтобы сделать все наоборот: CreateCollation and db_collation to implement a case-insensitive Charfield with Postgres > 12
https://gist.github.com/hleroy/2f3c6b00f284180da10ed9d20bf9240a
может ли кто-нибудь помочь мне?
Для проверки решения, предложенного @rickjames, я документирую реализацию ответа здесь:
в settings.py:
if app_version == 'prod':
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': '/home/src/my.cnf'
}
}
}
DB_IS_MYSQL = True
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
DB_IS_MYSQL = False
MYSQL_SENSITIVE_COLLATION = 'ascii_bin'
DB_CASE_SENSITIVE_COLLATION = {'db_collation': MYSQL_SENSITIVE_COLLATION} if DB_IS_MYSQL else {}
# Use:
# from django.conf import settings
# pieces = models.CharField(max_length=255, default='empty', unique=True, **settings.DB_CASE_SENSITIVE_COLLATION)
в model.py:
name = models.CharField(max_length=50, **settings.DB_CASE_SENSITIVE_COLLATION)