1

我有一个表(其中包含数据的现有表)并且该表有一个用户名列。我希望这个用户名是唯一的。所以我添加了一个这样的约束:

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

这会产生一个用户列表,所有用户的 NumberOfUsers 都为 1。所以那里没有重复。但是当我检查他失败的用户名时,我看到以下结果:

beluga
béluga

所以显然他没有比较“e”和“é”或“è”......就像他忽略了这些,有什么办法让sql在添加唯一键约束时不忽略这些重音。

解决方案:

谢谢你们,我找到了解决方案。这解决了问题:

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

5 回答 5

7

在比较时,您使用的排序规则很可能会忽略大小写和重音符号。您需要更改排序规则。

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

SQL 服务器排序规则名称列表在这里

于 2009-03-04T08:22:17.410 回答
5

您的查询也按 UserID 分组 - 您不想这样做。

采用:

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

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

正如其他人所建议的那样,您也可能遇到整理问题,但通常, GROUP BY 将是自洽的。

于 2009-03-04T08:23:31.057 回答
2

大概 UserId 是您的主键。由于它是您分组依据的一部分,因此您可以保证每组获得一行。将“userId”列从您的组中取出。

于 2009-03-04T08:24:25.003 回答
1

正如 Andrew Barrett 所说,MySQL 中的默认排序规则不能正确识别重音符号。

将字段的排序规则更改为UTF8_unicode_ci,它应该可以正确看到重音符号。

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

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

于 2009-03-04T08:23:30.807 回答
0

另请注意,您还可以仅创建您对相关排序规则感兴趣的表(而不是服务器范围)。因此您还可以执行以下操作:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
于 2009-03-04T08:34:27.880 回答