gpt4 book ai didi

c# - "Duplicate entry for key primary"在一台机器上而不是另一台机器上,具有相同的数据?

转载 作者:IT王子 更新时间:2023-10-28 23:44:55 25 4
gpt4 key购买 nike

我的问题:在我的本地机器/MySQL 数据库上插入一组数据有效,但在生产中会导致 Duplicate entry for key 'PRIMARY' 错误。据我所知,这两种设置是等效的。

我的第一个想法是这是一个排序规则问题,但我检查了两个数据库中的表都在使用 utf8_bin

表格一开始是空的,我在代码中执行 .Distinct(),所以不应该有任何重复的条目。

有问题的表:

CREATE TABLE `mytable` (
`name` varchar(100) CHARACTER SET utf8 NOT NULL,
`appid` int(11) NOT NULL,
-- A few other irrelevant fields
PRIMARY KEY (`name`,`appid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Database.cs:

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class Database : DbContext
{
public DbSet<MyTable> MyTable { get; set; }
public static Database Get()
{
/* Not important */
}
//etc.
}

MyTable.cs:

[Table("mytable")]
public class MyTable : IEquatable<MyTable>, IComparable, IComparable<MyTable>
{
[Column("name", Order = 0), Key, Required, DatabaseGenerated(DatabaseGeneratedOption.None)]
public string Name
{
get { return _name; }
set { _name = value.Trim().ToLower(); }
}

private string _name;

[Column("appid", Order = 1), Key, Required, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ApplicationId { get; set; }

//Equals(), GetHashCode(), CompareTo(), ==() etc. all auto-generated by Resharper to use both Name and ApplicationId.
//Have unit-tests to verify they work correctly.
}

然后使用它:

using(Database db = Database.Get())
using(DbContextTransaction transaction = db.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
{
IEnumerable<MyTable> newEntries = GetNewEntries();
//Verify no existing entries already in the table; not necessary to show since table is empty anyways
db.MyTable.AddRange(newEntries.Distinct());
}

当使用 utf8_bin 时,我不知道在代码中执行 .Distinct() 后如何在数据库中出现重复条目​​,尤其是因为它在一台机器上工作,但不能在另一台机器上工作。有人有什么想法吗?

最佳答案

我会调查以下几点:

  • 检查两台机器上的确切 MySQL 版本。您可以在 MySQL 客户端中使用 SHOW VARIABLES LIKE "%version%";
  • 使用 SELECT HEX(name) 查看重复行的数据是如何编码的。
  • 调查“utf8”数据是否存储在 utf8mb3 或 utf8mb4 中

https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb3.html

https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html

假设在开发机器上,数据是从全新安装插入的,而在生产机器上,数据可能已经插入旧版本,然后服务器升级,我会特别检查是否需要采取行动(并已完成)以正确完成升级过程。

特别是,请参阅 MySQL 引用手册中的这些部分(正确版本):

https://dev.mysql.com/doc/refman/5.7/en/checking-table-incompatibilities.html

如有必要,重建索引。

https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html

编辑 (2016-10-12)

以上所有内容都集中在 table 和存储上。

要检查的另一部分是客户端和服务器之间的连接,使用 character_set_connection 等变量。

请检查所有字符集相关的系统变量,进行比较。

mysql> show variables like "%character%";
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /home/malff/GIT_TRUNK/sql/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.02 sec)

关于c# - "Duplicate entry for key primary"在一台机器上而不是另一台机器上,具有相同的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39884967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com