Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表列上的唯一约束_Sql_Sql Server_Constraints_Diacritics_Unique Key - Fatal编程技术网

Sql 表列上的唯一约束

Sql 表列上的唯一约束,sql,sql-server,constraints,diacritics,unique-key,Sql,Sql Server,Constraints,Diacritics,Unique Key,我有一个表(一个包含数据的现有表),该表有一个列用户名。 我希望这个用户名是唯一的。 因此,我添加了一个如下约束: ALTER TABLE Users ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName]) 现在,我不断得到这个表中存在重复用户的错误。 但我已使用以下查询检查了数据库: SELECT COUNT(UserId) as NumberOfUsers, UserName FROM Users

我有一个表(一个包含数据的现有表),该表有一个列用户名。 我希望这个用户名是唯一的。 因此,我添加了一个如下约束:

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\u General\u CI\u AI
    忽略大小写和重音
  • Latin1\u General\u CI\u AS
    不会忽略重音

SQL server排序规则名称列表。

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

  • Latin1\u General\u CI\u AI
    忽略大小写和重音
  • Latin1\u General\u CI\u AS
    不会忽略重音

SQL server排序规则名称列表。

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

将字段的排序规则更改为
UTF8\u unicode\u ci
,它应该可以正确地看到重音符号

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


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

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

将字段的排序规则更改为
UTF8\u unicode\u ci
,它应该可以正确地看到重音符号

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


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

您的查询组也可以通过UserID进行复制-您不想这样做

使用:

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


正如其他人所建议的那样,您也可能在排序方面存在问题,但通常情况下,GROUPBY是自一致的。

您的查询组也是按用户ID进行的-您不想这样做

使用:

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


正如其他人所建议的那样,您也可能在排序方面存在问题,但通常情况下,GROUPBY是自一致的。

假定UserId是您的主键。因为它是分组依据的一部分,所以保证每个组只获得一行。将“userId”列从您的组中删除。

假定userId是您的主键。因为它是分组依据的一部分,所以保证每个组只获得一行。将“userId”列从您的组中删除。

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

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

还要注意的是,您也可以只创建对相关排序规则感兴趣的表(而不是服务器范围的表)

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

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