【问题标题】:Unique constraint on table column表列的唯一约束
【发布时间】:2010-10-11 05:09:15
【问题描述】:

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

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

【问题讨论】:

  • 这似乎是数据库排序规则的问题。它设置为什么排序规则?

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


【解决方案1】:

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

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

SQL 服务器排序规则名称列表here

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      用途:

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

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

      您也可能遇到其他人建议的排序规则问题,但通常 GROUP BY 会是自洽的。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2021-01-22
            • 2018-02-02
            • 2012-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多