从C#在MySQL中存储GUID

试图将Guid的内容保存在来自C#(.NET)的MySQL数据库中。 MySQL列的类型为BINARY(16)。 有关如何坚持guid以及后来从MySQL获取guid的任何消息? 在这里寻找代码答案:-)

弄清楚了。 这是如何做 …

数据库架构

CREATE TABLE `test` ( `id` BINARY(16) NOT NULL, PRIMARY KEY (`id`) ) 

 string connectionString = string.Format("Server={0};Database={1};Uid={2};pwd={3}", "server", "database", "user", "password"); Guid orgId = Guid.NewGuid(); Guid fromDb = Guid.Empty; using (MySqlConnection conn = new MySqlConnection(connectionString)) { conn.Open(); using (MySqlCommand cmd = new MySqlCommand("INSERT INTO test (id) VALUES (?id)", conn)) { cmd.Parameters.Add("id", MySqlDbType.Binary).Value = orgId.ToByteArray(); cmd.ExecuteNonQuery(); } using (MySqlCommand cmd = new MySqlCommand("SELECT id FROM test", conn)) { using (MySqlDataReader r = cmd.ExecuteReader()) { r.Read(); fromDb = new Guid((byte[])r.GetValue(0)); } } } 

显然,应修复MySQL .NET Connector v5.2.6 +中的GetGuid()方法,以便您可以使用此示例 。

1)你可以像@Tim Skauge那样插入它。 但是选择.Net连接器版本很重要。 当我使用v 5.2.1时,我只需要这样做:

 using (MySqlCommand cmd = new MySqlCommand("SELECT id FROM test", conn)) { using (MySqlDataReader r = cmd.ExecuteReader()) { r.Read(); Guid id = (Guid)r[0]; } } 

这里读者自己将二进制值读取为.NET Guid类型。 如果检查r[0]的类型,可以看到它。 但是对于更新版本,即6.5.4,我发现类型为byte[] ..即,它从db获取二进制值到其对应的字节数组。 所以你这样做:

 using (MySqlCommand cmd = new MySqlCommand("SELECT id FROM test", conn)) { using (MySqlDataReader r = cmd.ExecuteReader()) { r.Read(); Guid id = new Guid((byte[])r[0]); } } 

您可以在文档中阅读原因。 直接读取Guid类型而不是byte []的替代方法是使用此行:连接字符串中的Old Guids=true

2)此外,您可以通过要求MySQL进行转换来直接将二进制值读取为字符串,但根据我的经验,此方法较慢。

插入:

 using (var c = new MySqlCommand("INSERT INTO test (id) VALUES (UNHEX(REPLACE(@id,'-','')))", conn)) { c.Parameters.AddWithValue("@id", Guid.NewGuid().ToString()); c.ExecuteNonQuery(); } 

要么

 using (var c = new MySqlCommand("INSERT INTO test (id) VALUES (UNHEX(@id))";, conn)) { c.Parameters.AddWithValue("@id", Guid.NewGuid().ToString("N")); c.ExecuteNonQuery(); } 

并选择:

 using (MySqlCommand cmd = new MySqlCommand("SELECT hex(id) FROM test", conn)) { using (MySqlDataReader r = cmd.ExecuteReader()) { r.Read(); Guid id = new Guid((string)r[0]); } } 

您需要注意的一件事是,如果您通过hex方法插入Guids,那么您必须通过unhex方法读取它。 如果你依靠.NET的ToByteArray()方法插入它们,那么你必须阅读类似的内容。 否则你会得到不正确的guid读取,因为.NET有一种特殊的方法来根据字节顺序排序字节。 在插入和读取.NET中的Guids的上下文中抓住它的一些东西