2

好的,我有一个 GUID f5cc4100-f1b4-4af6-9e9e-224b0eb74166,我正在使用 ADO .NET 连接器将它插入 MySQL 数据库。

我可以通过两种方式做到这一点:

1) 将字节数组馈送到 .NET 连接器

string query = "insert into test (pk_id) values (@id)";
using (var c = new MySqlCommand(query, conn))
{
    c.Parameters.AddWithValue("@id", new Guid("f5cc4100-f1b4-4af6-9e9e-224b0eb74166").ToByteArray());
    c.ExecuteNonQuery();
}

2)依靠MySQL标准函数将十六进制转换为二进制字符串。

string query = "insert into test (pk_id) values (UNHEX(@id))";
using (var c = new MySqlCommand(query, conn))
{
    c.Parameters.AddWithValue("@id", "f5cc4100-f1b4-4af6-9e9e-224b0eb74166".Replace("-", "");
    c.ExecuteNonQuery();
}

我面临的问题是上述两种方法以稍微不同的字符顺序插入相同的 guid。

如果我像这样选择插入的 guid:

string query = "select PK_id from test";
using (var c = new MySqlCommand(query, conn))
{
    using (var r = c.ExecuteReader())
    {
        while (r.Read())
        {
            var k = new Guid((byte[])r[0]);
        }
    }
}

f5cc4100-f1b4-4af6-9e9e-224b0eb74166来回0041ccf5-b4f1-f64a-9e9e-224b0eb74166。但是,如果我这样阅读:

string query = "select hex(PK_id) from test";
using (var c = new MySqlCommand(query, conn))
{
    using (var r = c.ExecuteReader())
    {
        while (r.Read())
        {
            var k = new Guid((string)r[0]);
        }
    }
}

我得到0041ccf5-b4f1-f64a-9e9e-224b0eb74166f5cc4100-f1b4-4af6-9e9e-224b0eb74166

简而言之,如果我将 GUID 作为字节数组插入,那么我需要照此读取它们并转换为字节数组以获得正确的 GUID。如果我将 GUID 作为UNHEX十六进制 guid 字符串插入,那么我需要使用其等效HEX函数从 db 中读取。

  1. 为什么上述两种方法的写作和阅读不同?

  2. 在两者之间处理 GUID 的更合适的方法是什么?

4

2 回答 2

1

由于原始海报要求将我的评论(只是链接)作为答案发布,因此它来了:

SO:.NET 中的 Guid 字节顺序

MSDN:System.Guid .ToByteArray 交换前 4 个字节

SO:C#:为什么 Guid.ToString(“n”) 与从相同 guid 的字节数组生成的十六进制字符串不同?

似乎没有清楚地记录Guid在转换为和从Byte[].

于 2012-06-24T14:00:02.987 回答
1

尼尔森回答了问题的一部分。至于使用哪个,没有什么是好的选择。无论哪种方式都很好。如果稍后需要在 .NET 世界之外读取 db 中的值,那么 MySQL hexing 和 unhexing 会更好。在我的测试中,与 hexing 和 unhexing 相关的性能损失很小(非常非常轻微)。如果这对您很重要,请坚持ToByteArray()

于 2012-06-27T23:22:55.887 回答