MYSQL: как сделать составное уникальное ограничение без учета регистра - PullRequest
0 голосов
/ 12 июня 2018

Запрос таблицы:

CREATE TABLE `TESTING_TABLE` (
   `ID` char(36) COLLATE utf8_bin NOT NULL,
   `NAME` char(36) COLLATE utf8_bin NOT NULL,
   `DISPLAY_NAME` varchar(128) COLLATE utf8_bin NOT NULL,
   UNIQUE KEY `DISPLAY_NAME_UK` (`NAME`,`DISPLAY_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

Вставка первой строки:

INSERT INTO `TESTING_TABLE` (`ID`, `NAME`, `DISPLAY_NAME`) VALUES ('1', 'Foo', 'Bar');

Вставка второй строки:

INSERT INTO `TESTING_TABLE` (`ID`, `NAME`, `DISPLAY_NAME`) VALUES ('2', 'Foo', 'bar');

Поскольку у меня есть уникальное ограничение DISPLAY_NAME_UK,Я ожидаю, что вставка второй строки должна вызвать исключение «Дублирующая запись».Но это разрешает регистрозависимые значения в столбце DISPLAY_NAME.Как сделать это без учета регистра?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Заменить utf8_bin на utf8_general_ci

CREATE TABLE `TESTING_TABLE` (
`ID` char(36) COLLATE utf8_bin NOT NULL,
`NAME` char(36) COLLATE utf8_bin NOT NULL,
`DISPLAY_NAME` varchar(128) COLLATE utf8_general_ci NOT NULL,
UNIQUE KEY `DISPLAY_NAME_UK` (`NAME`,`DISPLAY_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
0 голосов
/ 12 июня 2018

Если вы хотите, чтобы «bar» и «Bar» обрабатывались как одно и то же значение, это не чувствительность к регистру, это регистр нечувствительность .

Самый простой подход, вероятно, будетиспользовать сортировку без учета регистра, например utf8mb4.

...