Существует ли сортировка MySQL utf8, которая не объединяет символы с акцентом? - PullRequest
4 голосов
/ 09 июля 2011

У меня есть таблица utf8, и я храню такие данные, как:

+-------+--------+
| name  | gender |
+-------+--------+
| ESMÉ  | F      | 
| ESME  | F      | 
+-------+--------+

Однако, когда я пытаюсь добавить уникальный ключ (имя, пол), эти две строки нарушают ограничение.Я смог достичь своей цели с помощью сортировки utf8_bin, но затем я теряю нечувствительность к регистру.

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

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Я не думаю, что то, что вы хотите, напрямую возможно.Сортировка определяет способ сортировки и сравнения вашей даты.Для вашего ключа вы хотите, чтобы два значения были видны как разные, но при обычном сравнении вы хотите, чтобы они были видны как одинаковые.

Однако при задании ваших запросов есть хитрость:результаты в utf8 без указания параметров сортировки.Это приведёт к результату и вернет параметры сортировки по умолчанию.

В следующем примере показано, что я имею в виду:

mysql> show create table test_col;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                        |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_col | CREATE TABLE `test_col` (
  `name` varchar(200) COLLATE utf8_bin DEFAULT NULL,
  UNIQUE KEY `ixuniq` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into test_col (name) values ('Y'),(unhex('c39d'));Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_col;
+------+
| name |
+------+
| Y    |
| Ý   |
+------+
2 rows in set (0.00 sec)

mysql> select * from test_col where name='Y';
+------+
| name |
+------+
| Y    |
+------+
1 row in set (0.00 sec)

mysql> select * from test_col where convert(name using 'utf8')='y';+------+
| name |
+------+
| Y    |
| Ý   |
+------+
2 rows in set (0.00 sec)
0 голосов
/ 23 мая 2012

У меня точно такая же проблема, параметры сортировки существуют в латинском, это latin1_general_ci, но в utf8 их нет. У вас есть 3 решения:

  • Использовать латинский
  • создать или найти человека, который создал сопоставление http://dev.mysql.com/doc/refman/5.0/en/ldml-collation-example.html (и дайте мне знать; -)
  • использовать верхний регистр при сравнении символов (или вставке их)
...