Вопрос

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

ALTER TABLE Users 
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])

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

SELECT COUNT(UserId) as NumberOfUsers, UserName 
FROM Users 
GROUP BY UserName, UserId 
ORDER BY UserName

В результате в списке пользователей будет 1 в качестве NumberOfUsers.Так что дубликатов здесь нет.Но когда я проверяю имя пользователя, он терпит неудачу, я вижу следующий результат:

beluga
béluga

Так что, очевидно, он не может сравнить «е» и «é» или «è»…Как будто он их игнорирует, есть ли способ, которым sql не игнорирует эти акценты при добавлении ограничения уникального ключа.

РЕШЕНИЕ:

Спасибо вам, ребята, я нашел решение.Это решило проблему:

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
Это было полезно?

Решение

Используемая вами сортировка, скорее всего, игнорирует регистр и акценты при сравнении.Вам нужно будет изменить сортировку.

  • Latin1_General_CI_AI Игнорирует регистр и акценты
  • Latin1_General_CI_AS не будет игнорировать акценты

Список имен параметров сортировки SQL-сервера здесь.

Другие советы

Ваши запросы также группируются по UserID — вы не хотите этого делать.

Использовать:

SELECT COUNT(*) as NumberOfUsers, UserName 
    FROM Users 
    GROUP BY UserName 
    ORDER BY UserName

Ваш запрос будет отображать только пользователей с тем же именем и тем же идентификатором пользователя.Или, может быть, упорядочить данные по COUNT(*) так что последняя строка, которая появляется, скорее всего, является нарушителем спокойствия?

У вас также могут возникнуть проблемы с сопоставлением, как предлагали другие, но обычно GROUP BY будет самосогласованным.

Предположительно UserId является вашим первичным ключом.Поскольку это часть того, по чему вы группируете, вы гарантированно получите одну строку на группу.Удалите столбец «userId» из своей группы.

Как говорит Эндрю Барретт, параметры сортировки по умолчанию в MySQL неправильно распознают акценты.

Измените параметры сортировки полей на UTF8_unicode_ci и он должен правильно видеть акценты.

ci означает нечувствительность к регистру, и вы можете использовать другие параметры сортировки, если регистр важен.

Вы можете создать новую таблицу с новыми параметрами сортировки, а затем скопировать * из существующей таблицы в новую.

Также обратите внимание, что вы также можете создать только интересующую вас таблицу с соответствующей сортировкой (вместо всего сервера). Таким образом, вы также можете сделать что-то вроде:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top