Почему MySQL относится к e так же, как к e? - PullRequest
8 голосов
/ 03 августа 2011

Я храню строки Unicode в базе данных MySQL с помощью веб-приложения Django. Я могу хорошо хранить данные Unicode, но при запросах обнаруживаю, что é и e обрабатываются так, как если бы они были одним и тем же символом:

In [1]: User.objects.filter(last_name='Jildén')
Out[1]: [<User: Anders Jildén>]

In [2]: User.objects.filter(last_name='Jilden')
Out[2]: [<User: Anders Jildén>]

Это также относится и к непосредственному использованию оболочки MySQL:

mysql> select last_name from auth_user where last_name = 'Jildén';
+-----------+
| last_name |
+-----------+
| Jildén   |
+-----------+
1 row in set (0.00 sec)

mysql> select last_name from auth_user where last_name = 'Jilden';
+-----------+
| last_name |
+-----------+
| Jildén   |
+-----------+
1 row in set (0.01 sec)

Вот настройки базы данных charset:

mysql> SHOW variables LIKE '%character_set%';
+--------------------------+------------------------------------------------------+
| Variable_name            | Value                                                |
+--------------------------+------------------------------------------------------+
| character_set_client     | latin1                                               |
| character_set_connection | latin1                                               |
| character_set_database   | utf8                                                 |
| character_set_filesystem | binary                                               |
| character_set_results    | latin1                                               |
| character_set_server     | latin1                                               |
| character_set_system     | utf8                                                 |
| character_sets_dir       | /usr/local/Cellar/mysql/5.1.54/share/mysql/charsets/ |
+--------------------------+------------------------------------------------------+

вот схема таблицы:

CREATE TABLE `auth_user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(30) CHARACTER SET utf8 NOT NULL,
    `first_name` varchar(30) CHARACTER SET utf8 NOT NULL,
    `last_name` varchar(30) CHARACTER SET utf8 NOT NULL,
    `email` varchar(200) CHARACTER SET utf8 NOT NULL,
    `password` varchar(128) CHARACTER SET utf8 NOT NULL,
    `is_staff` tinyint(1) NOT NULL,
    `is_active` tinyint(1) NOT NULL,
    `is_superuser` tinyint(1) NOT NULL,
    `last_login` datetime NOT NULL,
    `date_joined` datetime NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=7952 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

и вот параметры, которые я передаю через настройку Django DATABASES:

DATABASES = {
    'default': {
        # ...
        'OPTIONS': {
            'charset': 'utf8',
            'init_command': 'SET storage_engine=INNODB;',
        },
    },
}

Обратите внимание, что я попытался установить параметры сортировки таблицы на utf8_bin, без эффекта:

mysql> alter table auth_user collate utf8_bin;

mysql> select last_name from auth_user where last_name = 'Jilden';
+-----------+
| last_name |
+-----------+
| Jildén   |
+-----------+
1 row in set (0.00 sec)

Как я могу заставить MySQL обрабатывать их как разные символы?

Ответы [ 3 ]

9 голосов
/ 03 августа 2011

Вы были почти там, когда вы изменили сортировку таблицы, но не совсем.В MySQL каждый столбец в таблице имеет свой собственный набор символов и параметры сортировки.Таблица имеет свой собственный набор символов и параметры сортировки, но это не отменяет параметры сортировки столбцов;он определяет только то, каким будет сопоставление для новых столбцов, для которых вы не указываете сопоставление.Таким образом, вы не изменили параметры сортировки интересующего вас столбца.

ALTER TABLE tablename MODIFY columnname
    varchar(???) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
8 голосов
/ 03 августа 2011

Вам необходимо установить параметры сортировки, в которых диакритические знаки рассматриваются как значимые.Попробуйте использовать utf8_bin

1 голос
/ 03 августа 2011

Я думаю, что было бы важно знать кодировку таблицы и поле, которое вы запрашиваете.

Ответ на ваш вопрос можно найти здесь
http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

Возможно, у поля, которое вы запрашиваете, есть кодировка utf8_general_ci .
Чтобы получить то, что вы хотите, вы должны установить кодировку этого поля как utf8_unicode_ci

Помните, чтокак говорится в руководстве, запросы к utf8_unicode_ci полям кодировки медленнее, чем запросы к utf8_general_ci полям

...