表列的唯一约束

时间:2009-03-04 08:18:12

标签: sql sql-server constraints diacritics unique-key

我有一个表(包含数据的现有表),该表有一个UserName列。 我希望这个UserName是唯一的。 所以我添加一个像这样的约束:

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

所以他显然没有比较“e”和“é”或“è”......就像他忽略了这些,在添加唯一键约束时,sql是否有任何方法不会忽略这些重音。 / p>

解决方案:

对你们来说,THX我找到了解决方案。 这解决了这个问题:

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS

5 个答案:

答案 0 :(得分:7)

您正在使用的排序规则最有可能在比较时忽略大小写和重音。您需要更改排序规则。

  • Latin1_General_CI_AI忽略大小写和重音
  • Latin1_General_CI_AS不会忽略重音

SQL Server排序规则名称列表here

答案 1 :(得分:5)

您的查询按用户ID分组 - 您不希望这样做。

使用:

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

您的查询只会显示具有相同名称和相同用户ID的用户。或者,也许,按COUNT(*)对数据进行排序,以便显示的最后一行很可能是麻烦制造者?

您可能也会遇到其他人建议的排序问题,但通常情况下,GROUP BY会自我保持。

答案 2 :(得分:2)

据推测,UserId是您的主键。由于它是您所分组的一部分,因此您可以保证每组获得一行。将“userId”列从您的组中删除。

答案 3 :(得分:1)

正如Andrew Barrett所说,MySQL中的默认排序规则无法正确识别重音。

将字段的整理更改为 UTF8_unicode_ci ,并且应该正确显示重音。

ci表示不区分大小写,如果大小写,则可以使用不同的排序规则。

您可以使用新的排序规则创建新表格,然后将现有表格中的*复制到新表格中。

答案 4 :(得分:0)

另请注意,您还可以创建您感兴趣的相关表(而不是服务器范围)。所以您还可以执行以下操作:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )