-
03-07-2019 - |
题
我有一个表(其中包含数据的现有表),并且该表有一列 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
这会产生一个用户列表,其中 NumberOfUsers 全部为 1。所以那里没有重复的。但是当我检查用户名时,他失败了,我看到以下结果:
beluga
béluga
所以显然他没有比较“e”和“é”或“è”......就像他忽略了这些一样,有什么方法可以让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 Server 排序规则名称列表 这里.
其他提示
您的查询按用户ID分组 - 您不希望这样做。
使用:
SELECT COUNT(*) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName
ORDER BY UserName
您的查询只会显示具有相同名称和相同用户ID的用户。或者,也许,通过 COUNT(*)
对数据进行排序,以便显示的最后一行很可能是麻烦制造者?
您可能也会遇到其他人建议的排序问题,但通常情况下,GROUP BY会自我保持。
据推测,UserId是您的主键。由于它是您所分组的一部分,因此您可以保证每组获得一行。取“userId”你的小组中的专栏。
正如Andrew Barrett所说,MySQL中的默认排序规则无法正确识别重音。
将字段的排序规则更改为 UTF8_unicode_ci
,并且应该正确显示重音。
ci表示不区分大小写,如果大小写,则可以使用不同的排序规则。
您可以使用新的排序规则创建新表格,然后将现有表格中的*复制到新表格中。
另请注意,您还可以创建您感兴趣的相关表(而不是服务器范围)。所以您还可以执行以下操作:
CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
不隶属于 StackOverflow