Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Changed "exact" matches in MySQL to use the database's native collation.

This effectively reverses the change in [7798]. It was proving too difficult to
successfully manage all the side effects here and provide a satisfactory
solution for everybody. Many thanks to arne, Martin von Löwis and, particular,
Karen Tracey, for doing a lot of research and proto-patches here to establish what was possible and practical.

This is backwards incompatible if you were relying on the behaviour after
[7798]. The docs have been updated to indicate the solution.

Refs #2170, #7789, #8102.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@8319 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 6294fc7179011847d8a9f906cf4939ebf9852265 1 parent ca71eac
@malcolmt malcolmt authored
View
4 django/db/backends/mysql/base.py
@@ -153,9 +153,9 @@ def year_lookup_bounds(self, value):
return [first % value, second % value]
class DatabaseWrapper(BaseDatabaseWrapper):
-
+
operators = {
- 'exact': '= BINARY %s',
+ 'exact': '= %s',
'iexact': 'LIKE %s',
'contains': 'LIKE BINARY %s',
'icontains': 'LIKE %s',
View
13 docs/db-api.txt
@@ -1327,6 +1327,19 @@ changed in the development version. Previously, it was (intentionally)
converted to ``WHERE id = NULL`` at the SQL level, which would never match
anything. It has now been changed to behave the same as ``id__isnull=True``.
+.. admonition:: MySQL comparisons
+
+ In MySQL, whether or not ``exact`` comparisons are case-sensitive depends
+ upon the collation setting of the table involved. The default is usually
+ ``latin1_swedish_ci`` or ``utf8_swedish_ci``, which results in
+ case-insensitive comparisons. Change the collation to
+ ``latin1_swedish_cs`` or ``utf8_bin`` for case sensitive comparisons.
+
+ For more details, refer to the MySQL manual section about `character sets
+ and collations`_.
+
+.. _character sets and collations: http://dev.mysql.com/doc/refman/5.0/en/charset.html
+
iexact
~~~~~~
View
6 tests/regressiontests/string_lookup/models.py
@@ -97,12 +97,6 @@ def __str__(self):
>>> Article.objects.get(text__exact='The quick brown fox jumps over the lazy dog.')
<Article: Article Test>
-# Regression tests for #2170: test case sensitiveness
->>> Article.objects.filter(text__exact='tHe qUick bRown fOx jUmps over tHe lazy dog.')
-[]
->>> Article.objects.filter(text__iexact='tHe qUick bRown fOx jUmps over tHe lazy dog.')
-[<Article: Article Test>]
-
>>> Article.objects.get(text__contains='quick brown fox')
<Article: Article Test>

0 comments on commit 6294fc7

Please sign in to comment.
Something went wrong with that request. Please try again.